目录:对向量、矩阵、和列表的操作
- 向量运算
- 再循环
- 基本函数
- 有关总体结构的信息
- 合并表格
- 函数apply()
- 函数sweep()
- 函数aggregate()
- 函数transform()
- 列表的循环
一:对向量、矩阵、和列表的操作
1:向量运算
在R中可以对向量和矩阵进行计算。
2:再循环
对于两个长度不一致的向量进行一项运算时,R会通过重复使用该向量的值来把最短的那个向量补充完整。
例如:
3:基本函数
- length():返回一个向量的长度。
> length(c(1,2,3,4,5))
[1] 5
- sort():以递增或递减的方式对一个向量的元素进行排序。
> sort(c(1,4,2,9,7,6))
[1] 1 2 4 6 7 9
> sort(c(1,3,6,2,7,4,8,1,0),decreasing = TRUE)
[1] 8 7 6 4 3 2 1 1 0
- rev():将一个向量的元素以倒序的方式重新排列
- order(),rank():第一个函数以向量的形式返回按增序或降序排列后的各元素在原始向量中的位置牵引,第二个函数返回各元素的排名序号(rank)所构成的向量。如果遇到某些元素取值相同时,排序总是按照从左至右的原则进行。
- unique():移除向量中重复出现的元素。
- duplicated():判断(真为TRUE,假为FALSE)向量中每个元素是否在它之前的元素中已经出现过。
3.1.有关总体结构的信息
- dim():矩阵或数据框的维数
- nrow():行的数目(number of row)
- ncol():列的数目(number of columns)
- dimnames():行和列的名称(列表的形式)
- names(),colnames():列的名称
- rownames():行的名称。
3.2合并表格(merging tables)
- 按列合并cbind()
> cbind(1:4,5:8)
[,1] [,2]
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
但是这种合并不是最优的,特别当合并两个表格时,会有重复项。在这种情况下,一个非常有用的函数是merge()
函数merge()默认的是合并两个数据框,令X和Y为我们想要合并的数据框,并令Z为X和Y合并后的数据框。注意,
合并是基于这两个数据框中有相同名称的列来进行的。我们称这些列为“共同列”。参变量by可用来指定(强制的)哪些列是
共同的。该参变量的值可以是一个名称向量、一个索引向量或一个逻辑值向量。所有其他的列将被merge()视为不同的列来处理,尽管他们有着相同的名称。函数merge()按下面的方式进行工作:
(1)对数据框x的每一行(个体),函数merge()将这一行的全部元素与Y的每一行的各元素进行比较,但只局限于共同列的子集。
(2)如果找到了一个完美匹配,他将认为这是同一个体,这一个体被添加到z中(作为一行),并将来自x和y的非共同列中的值填充过去;
(3)若没有发现完美匹配,个体要么被添加到z并以NA完成填充【如果参变量all()取值为TRUE】,要么直接移除【参变量all()取默认值为FALSE]
(4)对下一行重复上面的操作直至最后一行为止。
ex:
> x<-data.frame(gender=c("f","m","m","f"),height=c(165,182,178,160),weight=c(50,65,67,55),income=c(80,90,60,150))
> y<-data.frame(gender=c("f","m","m","f"),height=c(165,182,178,160),weight=c(55,65,67,85),income=c(70,90,40,40),row.names=4:7)
> x
gender height weight income
1 f 165 50 80
2 m 182 65 90
3 m 178 67 60
4 f 160 55 150
> y
gender height weight income
4 f 165 55 70
5 m 182 65 90
6 m 178 67 40
7 f 160 85 40
> merge(x,y,by=c("gender","height"))
gender height weight.x income.x weight.y income.y
1 f 160 55 150 85 40
2 f 165 50 80 55 70
3 m 178 67 60 67 40
4 m 182 65 90 65 90
> merge(x,y,by=c("gender","weight"))
gender weight height.x income.x height.y income.y
1 f 55 160 150 165 70
2 m 65 182 90 182 90
3 m 67 178 60 178 40
> merge(x,y,by=c("gender","weight"),all=TRUE)
gender weight height.x income.x height.y income.y
1 f 50 165 80 NA NA
2 f 55 160 150 165 70
3 f 85 NA NA 160 40
4 m 65 182 90 182 90
5 m 67 178 60 178 40
> merge(x,y,by=c("row.names","weight"))
Row.names weight gender.x height.x income.x gender.y height.y income.y
1 4 55 f 160 150 f 165 70
> merge(x,y,by=c("row.names","weight"),all=TRUE)
Row.names weight gender.x height.x income.x gender.y height.y income.y
1 1 50 f 165 80 <NA> NA NA
2 2 65 m 182 90 <NA> NA NA
3 3 67 m 178 60 <NA> NA NA
4 4 55 f 160 150 f 165 70
5 5 65 <NA> NA NA m 182 90
6 6 67 <NA> NA NA m 178 40
7 7 85 <NA> NA NA f 160 40
注意:在确定共同个体时,函数merge()默认的不会去考虑数据框x和y中个体的名称。若要把个体的名称包含进去,可以选择给x和y添加一个ID列以识别各个个体,或者使用行名“row.names"作为参变量by的取值。
- 合并行
通用的函数时rbind()
3.3.函数apply()
apply()是一个常用的函数,他可以使用另一个给定的函数(由参变量FUN的取值来指定)来对一个矩阵或数据框的全部行(MARGIN=1)或全部列(MARGIN=2)来进行计算。
> x<-matrix(c(1:4,1,6:8),nrow=2)
> x
[,1] [,2] [,3] [,4]
[1,] 1 3 1 7
[2,] 2 4 6 8
> apply(x,MARGIN=1,FUN=mean)
[1] 3 5
> apply(x,MARGIN=2,FUN=mean)
[1] 1.5 3.5 3.5 7.5
小窍门:当操作或运算是对行或列进行汇总或求均值时,也可以直接使用函数:rowSums(),colSums(),rowMeans(),colMeans()
3.4函数sweep()
函数sweep()用来从一个表格的每一行(MARGIN=1)或每一列(MARGIN=2)中“清理”(具体含义有参变量FUN的值定义)某一统计值(由参变量STATS的值来指定)。
> x
[,1] [,2] [,3] [,4]
[1,] 1 3 1 7
[2,] 2 4 6 8
> sweep(x,MARGIN=1,STATS=c(3,5),FUN="-") ##从第一行减去3,从第二行减去5
[,1] [,2] [,3] [,4]
[1,] -2 0 -2 4
[2,] -3 -1 1 3
> sweep(x,MARGIN=2,STATS=c(1,2,3,4),FUN="-") ##从第一列减去1,第二列减去2,第三列减去3,第四列减去4
[,1] [,2] [,3] [,4]
[1,] 0 1 -2 3
[2,] 1 2 3 4
3.5 函数stack()
函数stack()将一个数据框的某些列的值串联成单个向量,该函数会输出一个数据框,其第一列为堆叠的向量,第二列包含一个因子用以指示各个观测的原始出处,函数unstack()执行逆向操作,对于方差分析(ANOVA)是非常有用的
> x<-data.frame(trt1=c(1,4,6,9),trt2=c(2,5,7,8))
> x
trt1 trt2
1 1 2
2 4 5
3 6 7
4 9 8
> stack(x)
values ind
1 1 trt1
2 4 trt1
3 6 trt1
4 9 trt1
5 2 trt2
6 5 trt2
7 7 trt2
8 8 trt2
3.6函数aggregate()
函数aggregate()根据一个因子(由参变量by的值指定)将一个数据框分裂成几个子总体并对每一个子总体应用某个预先给定的函数。
> x<-data.frame(gender=c("f","m","m","f"),height=c(165,182,178,160),weight=c(50,65,67,55),income=c(80,90,60,150))
> x
gender height weight income
1 f 165 50 80
2 m 182 65 90
3 m 178 67 60
4 f 160 55 150
> aggregate(x[,-1],by=list(gender=x[,1]),FUN=mean) **x【,-1】表示抽取除第一列之外的所有列
gender height weight income
1 f 162.5 52.5 115
2 m 180.0 66.0 75
3.7函数transform()
该函数用来对一个数据框的列进行转换操作。例如,接下来的例子将身高的单位从cm转换为m,并为数据框添加了一个新的列BMI。
> x
gender height weight income
1 f 165 50 80
2 m 182 65 90
3 m 178 67 60
4 f 160 55 150
> y<-transform(x,height=height/100,BMI=weight/(height/100)^2)
> y
gender height weight income BMI
1 f 1.65 50 80 18.36547
2 m 1.82 65 90 19.62323
3 m 1.78 67 60 21.14632
4 f 1.60 55 150 21.48437
注意:程序包plyr以一种简单而有效的方式来对数据表进行管理和操作。
4.列表的运算(循环函数)
函数lapply()和sapply()都类似于函数apply(),他们都对一个列表的每一个组成部分应用某一个函数,但前者输出一个列表,而后者输出一个向量。
lapply(x,function),sapply(x,function)