R语言学习笔记1_R的基本原理

一、R入门

1.1 程序包的安装与使用

1) 安装程序包PKname
> install.packages("PKname") 
2)载入新安装的程序包
> library("PKname") # 或library('PKname'),library(PKname)

1.2 R区分大小写

1.3 函数赋值的三种方法

> a = 10
> b <- 20
> assign('c',30)

1.4 获取在线帮助

1)代码调用在线帮助文档
> help.start() # R的常见问题FAQ
2)查看R中某一函数或关键字符的详细信息
> help(PK) # 或?PK
> help('char')
> apropos('PK') # 找出所有名字中含有指定字符串'PK'的函数(只会在被载入内存中的程序包中搜索)
> help.search('char') # 列出所有在帮助页面含有字符'char'的函数,比上面的搜索范围更广
> find('fun') # 得到名为fun函数所在的程序包
> args('fun') # 得到名为fun函数的自变量列表

默认状态下,函数help()只会在被载入内存的程序包中搜索,若想搜索没有载入内存的包可以试试下面的两个方法:

> help('bs',try.all.packages=TURE) #前提是bs包已被安装
> help('bs',package = 'splines')

1.5 简单的R会话

1.5.1 数据的浏览与编辑

1)数据的浏览
> mtcars # 显示数据集mtcars中全部观测值
> head(mtcars,n) # 仅显示数据集的前n个观测值,默认为6
> tail(mtcars) # 仅显示数据集的后6个观测值
> names(mtcars) # 仅显示数据集中的变量
> attach(mtcars) # 激活mtcars,使之成为当前数据集(便于直接查看某一变量内容:激活后直接输入变量名即可)

2)数据的编辑
> data.entry(mtcars) # 通过数据编辑器打开数据集,可对观测值进行修改
> MTcars<- edit(mtcars) #通过数据编辑器打开数据集进行修改,将新生成的数据集赋给MTcars,原来的数据集保持不变
> fix(mtcars) # 对数据集直接修改,等价于 mtcars <- edit(mtcars)

对于一维数据,data.entry( ) 打开的是数据编辑器,可以直接修改数据。而edit( ) 打开的是写字板,无法对数据集直接进行修改,只能通过赋值。

1.5.2 属性变量的分析

> table(cyl) # cyl是属性变量,cyl取3个值4,6,8相应的频数为11,7,14
> barplot(table(cyl)) #显示cyl的频数直方图

1.5.3 数值型数据的分析

1)茎叶图 stem( )
2)直方图 hist( )
3)箱线图/框须图 boxplot( )
4)计算平均值 mean( )

计算截去10%的mpg的平均值 mean(mpg, trim = .1)
按分组变量cyl计算mpg的分组平均值 tapply(mpg, cyl, mean)
计算cyl为4的那些mpg的平均值 mean(mpg[cyl==4])

5)计算四分位数的极差 IQR( )
6)计算样本常用的分位数:极小、极大、中位数以及两个四分位数 quantile( )fivenum( )

计算由向量prob给定的各概率处的样本分位数 quantile(mpg, prob)

7)计算常用的描述性统计量 summary( )
8)计算标准差 sd( ) 方差 var( )
9)计算中位绝对离差 mad( ) 常用于异常值检测,相对于标准差更不受异常值的影响

1.5.4 寻找二元关系

1)画二维散点图 plot(x,y)
2)拟合线性回归 z=lm(y ~ x)
3)相关系数:考察回归拟合的好坏程度 cor(y,x)cor(y,x)^2
4)残差分析

> lm.res <- lm(cyl ~ mpg) # 将回归分析的结果作为对象保存到lm.res中
> lm.resids <- resid(lm.res) # 提取残差向量
> plot(lm.resids) # 考查残差的散点图
> hist(lm.resids) # 考查残差的直方图:钟型?
> qqnorm(lm.resids) # 残差的QQ图是否落在直线上? 是,则线性相关

1.5.5 结束分析并退出R

> detach( ) # 从内存中清除数据集
> q( ) # 退出R

1.6 R的数据结构

1.6.1 数据对象及类型

对象向量因子数组矩阵数据框时间序列列表
是否允许一个对象中有多种类型
  • 数值型
    • 整型
    • 单精度实型
    • 双精度实型
  • 字符型
  • 复数型
  • 逻辑型

查看对象的类型mode( ) 和长度 length( )

Inf-InfNANaN
正无穷负无穷缺失值 not available不是数字的值not a number

1.6.2 浏览对象的信息

ls( ) 显示所有在内存中的对象名
ls( pat = ‘m’) 显示名称中带有某个指定字符的对象
ls.str( ) 显示内存中所有对象的详细信息,所显示结果过长,可将参数 max.level = -1

rm(x) 删除对象x
rm(x,y) 删除对象x和y
rm(list=ls( )) 删除内存中的所有对象
rm(list=ls( pat=’^m’ )) 删除对象中以字母m开头的对象

1.6.3 向量的建立

数值型向量的建立

1)seq( )“ : ” # 若向量(序列)具有较为简单的规律
2)rep( ) # 若向量(序列)具有较为复杂的规律
3)c( ) # 若向量(序列)没有什么规律
4)scan( ) #通过键盘逐个输入

> 1:5
[1] 1 2 3 4 5
> 1:5-1
[1] 0 1 2 3 4
> 1:(5-1)
[1] 1 2 3 4
> seq(1,2,by=0.5) #等价于seq(from=1,to=2,by=0.5)
[1] 1.0 1.5 2.0
> seq(1,5,length=3) #等价于seq(1,5,length.out=3)
[1] 1 3 5
> rep(1:3,2) #等价于 rep(2:5,times=2)
[1] 1 2 3 1 2 3
> rep(2:5,rep(2:3,2))
[1] 2 2 3 3 3 4 4 5 5 5
> rep(1:3,times=3,each=2) 
[1] 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3
> c(3,5)
[1] 3 5
> rep(c(3,5),c(2,4))
[1] 3 3 5 5 5 5
> sequence(1:3)
[1] 1 1 2 1 2 3
> sequence(c(10,5))
[1]  1  2  3  4  5  6  7  8  9 10  1  2  3  4  5
字符型向量的建立
> c('red','blue','-1')
[1] "red"  "blue" "-1"  
> paste(c('x','y'),1:10,sep='')
[1] "x1"  "y2"  "x3"  "y4"  "x5"  "y6"  "x7"  "y8"  "x9"  "y10"
> paste(c('x','y'),1:10,sep='*')
[1] "x*1"  "y*2"  "x*3"  "y*4"  "x*5"  "y*6"  "x*7"  "y*8"  "x*9"  "y*10"
逻辑型向量的建立
FALSETRUENA
01
> x=c(10.1,2.3,5.6,7,9.0)
> x>10
[1]  TRUE FALSE FALSE FALSE FALSE
> !(5==6)==1
[1] TRUE
> (1==2)|1>0
[1] TRUE
因子型向量的建立

factor(x , levels=sort(unique(x),na.last = TRUE), labels = levels,exclude = NA, ordered = is.ordered(x), nmax = NA)
x可以是字符型、数值型
levels 用来指定因子的水平
labels 用来指定水平的名字
exclude 表示从向量x中剔除的水平值
ordered 逻辑型选项,用来指定因子的水平是否有次序

1)将字符型向量转换成因子
> a <- c('green','blue','green','red')
> factor(a)
[1] green blue  green red  
Levels: blue green red

2)将数值型向量转换成因子
> b <- c(1,2,3,1)
> factor(b)
[1] 1 2 3 1
Levels: 1 2 3

3)将字符型因子转换为数值型因子
> a <- c('green','blue','green','red')
> a <- factor(a)
> levels(a) <- c(1,2,3,4)
> a
[1] 2 1 2 3
Levels: 1 2 3 4

> b <- factor(c('a','b','c','a'),labels = c(1,2,3))
> b
[1] 1 2 3 1
Levels: 1 2 3

4)将数值型因子转换为字符型因子
> b <- c(1,2,3,1)
> b <- factor(b)
> levels(b) <- c('A','B','C')
> b
[1] A B C A
Levels: A B C

> c <- factor(1:3,labels = c('a','b','c')) 
> c
[1] a b c
Levels: a b c

gl(k,n) 其中k是水平数,n是每个水平重复的次数。length 指定产生数据的个数,label 用来指定每个水平因子的名字。

> gl(3,5)
 [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
Levels: 1 2 3
> gl(3,5,length = 30)
 [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
Levels: 1 2 3
> gl(2,3,label=c('Male','Female'))
[1] Male   Male   Male   Female Female Female
Levels: Male Female
数值型向量的运算

循环法则:若同一个表表达式中的向量长度不相同,表达式的结果是一个与表达式中最长向量具有相同长度的向量;表达式中较短的向量会根据它的长度被重复使用若干次(不一定是整数次),直到与长度最长的向量相匹配,而常数将被被不断重复。

> 5+c(1,2,3)
[1] 6 7 8
> 5*c(1,2,3)
[1]  5 10 15
> c(-1,-2,-3)+c(3,2,1)
[1]  2  0 -2
> c(-1,-2,-3)+c(3,2)
[1] 2 0 0
Warning message:
In c(-1, -2, -3) + c(3, 2) : 长的对象长度不是短的对象长度的整倍数
> c(1,2,3)^2
[1] 1 4 9
> sqrt(c(2,4,8))
[1] 1.414214 2.000000 2.828427
> 
> 1:2+1:4
[1] 2 4 4 6
向量的下标index和子集元素的提取
> x<- c(1,2,3,4,5,6,7,8,9,10)
1)正整数向量
> x[1:5]
[1] 1 2 3 4 5
> x[c(1,5)]
[1] 1 5
2)负整数向量
> x[-(1:5)]
[1]  6  7  8  9 10

3)字符串向量
> fruit <- c(1,3,5,7)
> names(fruit) <- c('orange','banana','apple','peach')
> fruit
orange banana  apple  peach 
     1      3      5      7 
> fruit[c('apple','orange')]
 apple orange 
     5      1 
     
4)逻辑向量:返回值为TRUE将被选出,FALSE将被忽略
> x[x>5]
[1]  6  7  8  9 10

> y=runif(100,min=0,max=1) # (0,1)上100个均匀分布的随机数
> sum(y<0.5) # 值小于0.5的元素个数
[1] 55
> sum(y[y<0.5]) # 值小于0.5的元素的总和
[1] 13.81504

1.6.4 数组与矩阵的建立

数组的建立

array(data, dim, dimnames)

> A <- array(1:8,dim=c(2,2,2))
> A
, , 1

     [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

     [,1] [,2]
[1,]    5    7
[2,]    6    8

> dim(A)
[1] 2 2 2
> dimnames(A)<- list(c('a','b'),c('c','d'),c('e','f'))
> A
, , e

  c d
a 1 3
b 2 4

, , f

  c d
a 5 7
b 6 8

> colnames(A)
[1] "c" "d"
> rownames(A)
[1] "a" "b"
> dimnames(A)
[[1]]
[1] "a" "b"

[[2]]
[1] "c" "d"

[[3]]
[1] "e" "f"
矩阵的建立

矩阵是数组的特例,因此矩阵也可以用函数 array( ) 来建立,例如:

> A<- array(1:6,c(2,3))
> A
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
> A<- array(1:4,c(2,3))
> A
     [,1] [,2] [,3]
[1,]    1    3    1
[2,]    2    4    2
> A<- array(1:8,c(2,3))
> A
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

matrix( ) 建立矩阵,用 diag( ) 建立对角矩阵更方便

> matrix(1,nr=2,nc=2)
     [,1] [,2]
[1,]    1    1
[2,]    1    1
> diag(3)
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    0
[3,]    0    0    1

> v<- c(10,20,30)
> diag(v)
     [,1] [,2] [,3]
[1,]   10    0    0
[2,]    0   20    0
[3,]    0    0   30

> diag(2.5,nr=3,nc=5)
     [,1] [,2] [,3] [,4] [,5]
[1,]  2.5  0.0  0.0    0    0
[2,]  0.0  2.5  0.0    0    0
[3,]  0.0  0.0  2.5    0    0

> X<-matrix(1:4,2)
> rownames(X)<-c('a','b')
> colnames(X)<-c('c','d')
> X
  c d
a 1 3
b 2 4

> matrix(1:4,2,4) # 按列填充
     [,1] [,2] [,3] [,4]
[1,]    1    3    1    3
[2,]    2    4    2    4

> matrix(1:4,2,4,byrow = TRUE) # 按行填充
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    1    2    3    4
数组与矩阵的下标index与子集元素的提取
> x <- matrix(1:6,2,3)
> x
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
> x[2,2] #提取一个元素
[1] 4
> x[2,] #提取若一个或若干个行或列
[1] 2 4 6
> x[,2]
[1] 3 4
> x[,2,drop=FALSE]
     [,1]
[1,]    3
[2,]    4
> x[,c(2,3),drop=FALSE]
     [,1] [,2]
[1,]    3    5
[2,]    4    6
> x[-1,] #去掉若一个或若干个行与列
[1] 2 4 6
> x[,-2]
     [,1] [,2]
[1,]    1    5
[2,]    2    6
> x[,3]<-NA #添加与替换元素
> x
     [,1] [,2] [,3]
[1,]    1    3   NA
[2,]    2    4   NA
> x[is.na(x)]<-1 #缺失值用1代替
> x
     [,1] [,2] [,3]
[1,]    1    3    1
[2,]    2    4    1
对矩阵的运算(函数)

1)矩阵的代数运算

转置函数t()
> x <- matrix(1:6,2,3)
> x
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
> t(x)
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6

提取对角元diag()
> x <- matrix(1:4,2,2)
> diag(x)
[1] 1 4

几个矩阵按行合并rbind()与按列合并cbind()
> m1 <- matrix(1,2,2)
> m2 <- matrix(2,2,2)
> rbind(m1,m2)
     [,1] [,2]
[1,]    1    1
[2,]    1    1
[3,]    2    2
[4,]    2    2
> cbind(m1,m2)
     [,1] [,2] [,3] [,4]
[1,]    1    1    2    2
[2,]    1    1    2    2

矩阵的逐元乘积*
> m2*m2
     [,1] [,2]
[1,]    4    4
[2,]    4    4

矩阵的代数乘积 %*%
> rbind(m1,m2) %*% cbind(m1,m2)
     [,1] [,2] [,3] [,4]
[1,]    2    2    4    4
[2,]    2    2    4    4
[3,]    4    4    8    8
[4,]    4    4    8    8
> cbind(m1,m2) %*% rbind(m1,m2)
     [,1] [,2]
[1,]   10   10
[2,]   10   10

方阵的行列式det()
> x <- matrix(1:4,2)
> x
     [,1] [,2]
[1,]    1    3
[2,]    2    4
> det(x)
[1] -2

2)矩阵的统计运算
apply(X,MARGIN,FUN)
X为参与运算的矩阵
FUN为上面的一个函数或“+” “-” “*” " \"
MARGIN=1表示按列计算,MARGIN=2表示按行计算,MARGIN=c(1,2)表示按行列计算(至少3维数组)
sweep(X,MARGIN,STATS,FUN)
表示从矩阵X中按MARGIN计算STATS,并从中除去(sweep out)

> m<-matrix(rnorm(n=12),nrow = 3)
> apply(m,MARGIN = 1,FUN = mean) #求各行的均值
[1] -0.41094201  0.07402136  0.47250511
> apply(m,MARGIN = 2,FUN = mean) #求各列的均值
[1]  0.2410150  0.3588764  0.1896264 -0.6087385

标准化
> scale(m,center = T,scale = T) 
减去中位数
> row.med=apply(m,MARGIN=1,FUN=median)
> sweep(m,MARGIN = 1,STATS = row.med,FUN='-')

1.6.5 数据框data frame的建立

数据框的直接建立
> x=c(45,6,78,2)
> y=1:4
> z.df=data.frame(index=y,value=x)
> z.df
  index value
1     1    45
2     2     6
3     3    78
4     4     2

数据框中的向量必须有相同的长度或长度有倍数关系,否则会报错。

数据框的间接建立
> foo<- read.table(file='C:/Users/Administrator/Desktop/foo.txt',header = T)
> foo
  treat weight
1     A    3.4
2     B     NA
3     A    5.8
适用于数据框的函数

attach( ) 挂接数据集使之激活
help( ) 显示前几行
summary( ) 显示主要的描述性统计量
pairs(data, panel=panel.smooth) 通过成对数据散点图考察变量之间的关系
xtabs(~state + conc, data=’ ') 由交叉分类因子产生一个列联表

数据框的下标与子集的提取
提取单个元素
> data[1,1]

提取一个子集
> data[c(1,2),]

提取一列变量的值
> 数据框名$变量名

提取满足条件的子集
> subset(data,条件)
数据框中添加新变量

在数据集Pur中增加变量iconc,其定义为1/conc
1)基本方法

Pur$iconc <- 1/Pur$conc 

2)使用 with( ) 函数

Pur$iconc <- with(Pur,1/conc)

3)使用 transform( ) 函数,且可一次性定义多个变量

Pur <- transform(Pur, iconc=1/conc,sqrtconc=sqrt(conc))
head(Pur)

1.6.6 列表list的建立

> L1 <- list(1:6, matrix(1:4, nrow = 2))
> L1
[[1]]
[1] 1 2 3 4 5 6

[[2]]
     [,1] [,2]
[1,]    1    3
[2,]    2    4

> L2 <- list(x= 1:6, y= matrix(1:4, nrow = 2))
> L2
$x
[1] 1 2 3 4 5 6

$y
     [,1] [,2]
[1,]    1    3
[2,]    2    4

> L2$x
[1] 1 2 3 4 5 6
> L2$y[4]
[1] 4
> L2[[2]][4]
[1] 4

1.6.7 时间序列ts的建立

ts(data = NA, start = 1, end = numeric(), frequency = 1,deltat = 1, ts.eps = getOption(“ts.eps”), class = , names = )

data一个向量或矩阵
start第一个观察值的时间,为一个数字或是一个由两个整数构成的向量
end最后一个观察值的时间,指定方法和start相同
frequency单位时间内观察值的频数(频率)
deltat两个观察值的时间间隔
ts.eps序列之间的误差限。如果序列之间的频率差异小于ts.eps,则认为这些序列的频率相等
class对象的类型
names一个字符型向量,给出多元序列中每个一元序列的名称。
> ts(1:10,start = 1959)
Time Series:
Start = 1959 
End = 1968 
Frequency = 1 
 [1]  1  2  3  4  5  6  7  8  9 10
 
> ts(1:47,frequency = 12,start = c(1959,2))
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1959       1   2   3   4   5   6   7   8   9  10  11
1960  12  13  14  15  16  17  18  19  20  21  22  23
1961  24  25  26  27  28  29  30  31  32  33  34  35
1962  36  37  38  39  40  41  42  43  44  45  46  47

> ts(1:10,frequency = 4,start = c(1959,2))
     Qtr1 Qtr2 Qtr3 Qtr4
1959         1    2    3
1960    4    5    6    7
1961    8    9   10  

1.7 数据的存储与读取

1.7.1 数据的存储

> d<-data.frame(obs=c(1,2,3),treat=c('a','b','c'),weight = c(2.3,NA,9))

1)保存为简单的文本文件

> write.table(d,file='C:/Users/Administrator/Desktop/foo.txt',row.names=F,quote = F)

row.names=F表示行名不写入文件,quote = F表示变量名不放在双引号中
2)保存为逗号分割的文本文件

> write.csv(d,file = 'C:/Users/Administrator/Desktop/foo.csv',row.names=F,quote = F)

3)保存为R格式文件

> save(d,file = 'C:/Users/Administrator/Desktop/foo.Rdata')

4)映像保存工作空间

> save.image()

1.7.2 数据的读取

文本文件数据的读取

1)使用函数 read.table( )

> setwd('C:/Users/Administrator/Desktop') #设置当前工作空间
> a <- read.table(file='test.txt') 
> a
  V1 V2 V3
1  a  b  c
2  1  2  3
3  4  5  6
> a <- read.table(file='test.txt',header = TRUE) 
> a
  a b c
1 1 2 3
2 4 5 6

2)使用函数 scan( ) 可以指定变量的类型,what缺省的情况下,默认创建数值型向量

> mydata<- scan('test.txt',what= list(A='',B='',C=''))
Read 3 records
> mydata
$A
[1] "a" "1" "4"

$B
[1] "b" "2" "5"

$C
[1] "c" "3" "6"

3)使用函数 read.fwf( ) 读取文件中一些固定宽度格式的数据

> mydata<- read.fwf('test.txt', widths = c(1,3,2),col.names = c('X','Y','Z')) 
> mydata
  X   Y  Z
1 A 1.7 S2
2 B 1.6 D2
3 C 1.5 F2
Excel数据的读取

利用剪贴板(复制好数据后,输入以下命令)

> mydata <- read.delim('clipboard')
R中数据集的读取
列出全部数据集
> data()
列出程序包中的数据集
> data(package='')

载入具体的数据集,此时不能直接按变量名进行计算
> data(dataname, package='')
设置当前数据集,此时可以通过变量名直接运算
>attach(dataname)
断开当前数据集
>detach(dataname)
R格式的数据
> attach(mtcars)
> mtcars2 <- data.frame(mtcars[,c(1,4))
> save(mtcars2,'c:/data/myR.Rdata')
> detach(mtcars)

> load('c:/data/myR.Rdata')

1.8 R的图形功能

高级绘图函数:创建一个新的图形
低级绘图函数:在现存的图形上添加元素
par( ) 可以永久的改变绘图参数

1.9 R编程

控制结构

1)条件语句

  • if (条件) 表达式1 else 表达式2
  • ifelse (条件,yes,no)
> if (x>=0) sqrt(x) else NA
> ifelse(x>=0,sqrt(x),NA)

2)循环

  • for (变量 in 向量) 表达式 # 知道终止条件时
  • while (条件) 表达式 # 无法知道运行次数时
  • repeat 表达式 # 无法知道运行次数时,可用break跳出循环
函数定义的基本形式

变量名 = function(变量列表)函数体

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值