对向量、矩阵、和列表的操作

Source
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/yfaixuexi/article/details/100738956

目录:对向量、矩阵、和列表的操作

  • 向量运算
  • 再循环 
  • 基本函数
  1. 有关总体结构的信息
  2. 合并表格
  3. 函数apply()
  4. 函数sweep()
  5. 函数aggregate()
  6. 函数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)