R语言有六种基本的数据结构,包括标量、向量、矩阵、数组、数据框和列表。 标量指具体的单个数值,是向量的特例,根据数据的维度和同质/异质可分为5种类型。

初识数据结构

向量举例

c1<-c(1,3,5,7,9)
c1
## [1] 1 3 5 7 9
c2<-c(2,4,6,8,10)
c2
## [1]  2  4  6  8 10

矩阵举例

mat1<-rbind(c1,c2)
mat1
##    [,1] [,2] [,3] [,4] [,5]
## c1    1    3    5    7    9
## c2    2    4    6    8   10
mat2<-cbind(c1,c2)
mat2
##      c1 c2
## [1,]  1  2
## [2,]  3  4
## [3,]  5  6
## [4,]  7  8
## [5,]  9 10

数组举例

dim1<-c("A1","A2")
dim2<-c("B1","B2","B3")
dim3<-c("C1","C2","C3","C4")
array1<-array(1:24,c(2,3,4),dimnames=list(dim1,dim2,dim3))
array1
## , , C1
## 
##    B1 B2 B3
## A1  1  3  5
## A2  2  4  6
## 
## , , C2
## 
##    B1 B2 B3
## A1  7  9 11
## A2  8 10 12
## 
## , , C3
## 
##    B1 B2 B3
## A1 13 15 17
## A2 14 16 18
## 
## , , C4
## 
##    B1 B2 B3
## A1 19 21 23
## A2 20 22 24
array2<-array(1:24,c(3,2,4),dimnames=list(dim2,dim1,dim3))
array2
## , , C1
## 
##    A1 A2
## B1  1  4
## B2  2  5
## B3  3  6
## 
## , , C2
## 
##    A1 A2
## B1  7 10
## B2  8 11
## B3  9 12
## 
## , , C3
## 
##    A1 A2
## B1 13 16
## B2 14 17
## B3 15 18
## 
## , , C4
## 
##    A1 A2
## B1 19 22
## B2 20 23
## B3 21 24

数据框举例

tree.id<-1:5
species<-c("sp1","sp2","sp3","sp4","sp5")
dbh<-c(1,3,5,7,9)
height<-c(2,4,6,8,10)
group<-c("Pioneer","Clamix","Exotic","Transtional","Climax")
tree<-data.frame(tree.id,species,dbh,height,group)
tree
##   tree.id species dbh height       group
## 1       1     sp1   1      2     Pioneer
## 2       2     sp2   3      4      Clamix
## 3       3     sp3   5      6      Exotic
## 4       4     sp4   7      8 Transtional
## 5       5     sp5   9     10      Climax

列表举例

list1<-list(C1=c1,Mat1=mat1,Array1=array1,Tree=tree)
list1
## $C1
## [1] 1 3 5 7 9
## 
## $Mat1
##    [,1] [,2] [,3] [,4] [,5]
## c1    1    3    5    7    9
## c2    2    4    6    8   10
## 
## $Array1
## , , C1
## 
##    B1 B2 B3
## A1  1  3  5
## A2  2  4  6
## 
## , , C2
## 
##    B1 B2 B3
## A1  7  9 11
## A2  8 10 12
## 
## , , C3
## 
##    B1 B2 B3
## A1 13 15 17
## A2 14 16 18
## 
## , , C4
## 
##    B1 B2 B3
## A1 19 21 23
## A2 20 22 24
## 
## 
## $Tree
##   tree.id species dbh height       group
## 1       1     sp1   1      2     Pioneer
## 2       2     sp2   3      4      Clamix
## 3       3     sp3   5      6      Exotic
## 4       4     sp4   7      8 Transtional
## 5       5     sp5   9     10      Climax
list2<-list(C2=c2,Mat2=mat2,Array2=array2,Tree=tree)
list2
## $C2
## [1]  2  4  6  8 10
## 
## $Mat2
##      c1 c2
## [1,]  1  2
## [2,]  3  4
## [3,]  5  6
## [4,]  7  8
## [5,]  9 10
## 
## $Array2
## , , C1
## 
##    A1 A2
## B1  1  4
## B2  2  5
## B3  3  6
## 
## , , C2
## 
##    A1 A2
## B1  7 10
## B2  8 11
## B3  9 12
## 
## , , C3
## 
##    A1 A2
## B1 13 16
## B2 14 17
## B3 15 18
## 
## , , C4
## 
##    A1 A2
## B1 19 22
## B2 20 23
## B3 21 24
## 
## 
## $Tree
##   tree.id species dbh height       group
## 1       1     sp1   1      2     Pioneer
## 2       2     sp2   3      4      Clamix
## 3       3     sp3   5      6      Exotic
## 4       4     sp4   7      8 Transtional
## 5       5     sp5   9     10      Climax

向量

向量(Vector)是R语言最基本的数据结构,称为 R 语言中的战斗机。

向量的创建

创建一组向量

x<-c(88,5,12,13,24,58,112)
x
## [1]  88   5  12  13  24  58 112

以同样方法创建 x 向量

x<-vector(length=7)
x[1]<-88
x[2]<-5
x[3]<-12
x[4]<-13
x[5]<-24
x[6]<-58
x[7]<-112
x
## [1]  88   5  12  13  24  58 112

使用:运算符创建向量

5:10
## [1]  5  6  7  8  9 10
10:5
## [1] 10  9  8  7  6  5

使用seq创建向量

seq(from=12,to=30,by=3)
## [1] 12 15 18 21 24 27 30
seq(12,30,3)
## [1] 12 15 18 21 24 27 30
seq(from=12,to=30,length=7)
## [1] 12 15 18 21 24 27 30
seq(12,30,length=7)
## [1] 12 15 18 21 24 27 30

使用rep创建向量

rep(20,each=5)
## [1] 20 20 20 20 20
rep(20,5)
## [1] 20 20 20 20 20
rep(c(1:3),each=3)
## [1] 1 1 1 2 2 2 3 3 3
rep(c(1:3),times=3)
## [1] 1 2 3 1 2 3 1 2 3
rep(c(1:3),3)
## [1] 1 2 3 1 2 3 1 2 3

添加向量元素

adx<-c(x[1:2],55,x[3:4],78,x[5:6],112,x[7])
adx
##  [1]  88   5  55  12  13  78  24  58 112 112

删除向量元素

rmx<-c(x[c(-4,-6)])
rmx
## [1]  88   5  12  24 112

以同样方法产生 rmx 向量

rmx<-x[c(1,2:3,5,7)]
rmx
## [1]  88   5  12  24 112

向量的索引

x<-c(88,5,12,13,24,58,112)
x
## [1]  88   5  12  13  24  58 112
x[1]
## [1] 88
x[1:3]
## [1] 88  5 12
v<-1:3
x[v]
## [1] 88  5 12
x[c(1,3,5:6)]
## [1] 88 12 24 58
x[c(1,1,1,3,5:6)]
## [1] 88 88 88 12 24 58
x[-1]
## [1]   5  12  13  24  58 112
x[-(1:3)]
## [1]  13  24  58 112
v<-1:3
x[-v]
## [1]  13  24  58 112
x[-c(1,3,5:6)]
## [1]   5  13 112
x[-c(1,1,1,3,5:6)]
## [1]   5  13 112

向量的运算

获取向量长度

x<-c(88,5,12,13,24,58,112)
x
## [1]  88   5  12  13  24  58 112
length(x)
## [1] 7
adx<-c(x[1:2],55,x[3:4],78,x[5:6],112,x[7])
adx
##  [1]  88   5  55  12  13  78  24  58 112 112
length(adx)
## [1] 10
rmx<-x[c(1,2:3,5,7)]
rmx
## [1]  88   5  12  24 112
length(rmx)
## [1] 5

简单运算

2+3
## [1] 5
"+"(2,3)
## [1] 5
2-3
## [1] -1
"-"(2,3)
## [1] -1
2*3
## [1] 6
"*"(2,3)
## [1] 6
2/3
## [1] 0.6666667
"/"(2,3)
## [1] 0.6666667

循环补齐

两个向量使用运算符时, R 会自动循环补齐,即重复较短的向量,直到它与另一个向量长度相匹配。

c(1,2,4)+c(2,4,6)
## [1]  3  6 10
c(1,2,4)+c(2,4,6,2)
## Warning in c(1, 2, 4) + c(2, 4, 6, 2): 长的对象长度不是短的对象长度的整倍数
## [1]  3  6 10  3
c(1,2,4)+c(2,4,6,2,4)
## Warning in c(1, 2, 4) + c(2, 4, 6, 2, 4): 长的对象长度不是短的对象长度的整倍数
## [1]  3  6 10  3  6
c(1,2,4)+c(2,4,6,2,4,6)
## [1]  3  6 10  3  6 10

allany函数

x<-c(88,5,12,13,24,58,112)
x
## [1]  88   5  12  13  24  58 112
any(x>20)
## [1] TRUE
all(x>20)
## [1] FALSE
any(x>4)
## [1] TRUE
all(x>4)
## [1] TRUE

NA 与 NULL 值

NA 表示缺失值, NULL 表示不存在的值

y<-c(1,6,34,NA,345,168)
y
## [1]   1   6  34  NA 345 168
mean(y)
## [1] NA
mean(y,na.rm=TRUE)
## [1] 110.8
y<-c(1,6,34,NULL,345,168)
y
## [1]   1   6  34 345 168
mean(y)
## [1] 110.8

向量筛选

x<-c(88,5,12,13,24,58,112)
x
## [1]  88   5  12  13  24  58 112
x[x*x>200]
## [1]  88  24  58 112
subset(x,x*x>200)
## [1]  88  24  58 112

which的用法

x<-c(88,5,12,13,24,58,112)
x
## [1]  88   5  12  13  24  58 112
which(x*x>200)
## [1] 1 5 6 7
x[which(x*x>200)]
## [1]  88  24  58 112

测试向量是否相等

x<-c(88,5,12,13,24,58,112)
x
## [1]  88   5  12  13  24  58 112
x1<-x
x1==x
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
"=="(x1,x)
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
x1!=x
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE
"!="(x1,x)
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE
x2=c(2,3,5,13,24,58,112)
x2==x
## [1] FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE
"=="(x2,x)
## [1] FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE
x2!=x
## [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE
"!="(x2,x)
## [1]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE

向量元素的名称

xy<-x
names(xy)
## NULL
names(xy)<-c("a","b","c","d","e","f","g")
xy
##   a   b   c   d   e   f   g 
##  88   5  12  13  24  58 112
xy["e"]
##  e 
## 24
xy[c("a","e")]
##  a  e 
## 88 24

矩阵

矩阵(matrix)是一种特殊的向量,包含两个附加的属性:行数和列数。

矩阵的创建

mat<-matrix(c(1:4),nrow=2,ncol=2)
mat
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
mat<-matrix(nrow=2,ncol=2)
mat[1,1]<-1
mat[2,1]<-2
mat[1,2]<-3
mat[2,2]<-4
mat
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
mrow<-matrix(c(1,2,3,4,5,6),nrow=2,byrow=TRUE)
mrow
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
mcol<-matrix(c(1,2,3,4,5,6),nrow=2)
mcol
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6

矩阵的索引

zmat<-matrix(1:18,nrow=6,ncol=3,byrow=TRUE)
zmat
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
## [4,]   10   11   12
## [5,]   13   14   15
## [6,]   16   17   18
zmat[1,1]
## [1] 1
zmat[1,]
## [1] 1 2 3
zmat[,1]
## [1]  1  4  7 10 13 16
zmat[,2:3]
##      [,1] [,2]
## [1,]    2    3
## [2,]    5    6
## [3,]    8    9
## [4,]   11   12
## [5,]   14   15
## [6,]   17   18
zmat[2:3,]
##      [,1] [,2] [,3]
## [1,]    4    5    6
## [2,]    7    8    9
zmat[2,2:3]
## [1] 5 6
zmat[2:3,2]
## [1] 5 8
zmat[-1,-1]
##      [,1] [,2]
## [1,]    5    6
## [2,]    8    9
## [3,]   11   12
## [4,]   14   15
## [5,]   17   18
zmat[-1,]
##      [,1] [,2] [,3]
## [1,]    4    5    6
## [2,]    7    8    9
## [3,]   10   11   12
## [4,]   13   14   15
## [5,]   16   17   18
zmat[,-1]
##      [,1] [,2]
## [1,]    2    3
## [2,]    5    6
## [3,]    8    9
## [4,]   11   12
## [5,]   14   15
## [6,]   17   18
zmat[,-c(2:3)]
## [1]  1  4  7 10 13 16
zmat[-c(2:3),]
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]   10   11   12
## [3,]   13   14   15
## [4,]   16   17   18
zmat[-2,-c(2:3)]
## [1]  1  7 10 13 16
zmat[-c(2:3),-2]
##      [,1] [,2]
## [1,]    1    3
## [2,]   10   12
## [3,]   13   15
## [4,]   16   18

矩阵的运算

矩阵相乘

mat<-matrix(c(1:4),nrow=2,ncol=2)
mat
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
mat%*%mat
##      [,1] [,2]
## [1,]    7   15
## [2,]   10   22

矩阵数量相乘

mat*3
##      [,1] [,2]
## [1,]    3    9
## [2,]    6   12

矩阵相加

mat+mat
##      [,1] [,2]
## [1,]    2    6
## [2,]    4    8

矩阵元素筛选

zmat<-matrix(1:18,nrow=6,ncol=3,byrow=TRUE)
zmat
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
## [4,]   10   11   12
## [5,]   13   14   15
## [6,]   16   17   18
zmat[zmat[,3]>=8,]
##      [,1] [,2] [,3]
## [1,]    7    8    9
## [2,]   10   11   12
## [3,]   13   14   15
## [4,]   16   17   18
zmat[zmat[,1]>2&zmat[2,]>4&zmat[3,]>6,]
##      [,1] [,2] [,3]
## [1,]    4    5    6
## [2,]    7    8    9
## [3,]   13   14   15
## [4,]   16   17   18

对矩阵的行和列调用函数

apply函数的一般形式为: apply(m,dimcode,f,fargs)。其中, m 是一个矩阵;dimcode是维度编号,若取值为 1 表示对每一行应用函数,若取值为 2 表示对每一列应用函数; f 是应用在行或列上的函数; fargs 是 f 的可选参数集。

zmat<-matrix(1:18,nrow=6,ncol=3,byrow=TRUE)
zmat
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
## [4,]   10   11   12
## [5,]   13   14   15
## [6,]   16   17   18
apply(zmat,1,mean)
## [1]  2  5  8 11 14 17
rowMeans(zmat)
## [1]  2  5  8 11 14 17
apply(zmat,2,mean)
## [1]  8.5  9.5 10.5
colMeans(zmat)
## [1]  8.5  9.5 10.5

矩阵的转置

zmat<-matrix(1:18,nrow=6,ncol=3,byrow=TRUE)
zmat
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
## [4,]   10   11   12
## [5,]   13   14   15
## [6,]   16   17   18
t(zmat)
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    4    7   10   13   16
## [2,]    2    5    8   11   14   17
## [3,]    3    6    9   12   15   18

增加或删除矩阵的行或列

可以通过函数 rbind(代表 row bind,按行组合)和函数 cbind(代表column bind,按列组合)

zmat<-matrix(1:18,nrow=6,ncol=3,byrow=TRUE)
zmat
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
## [4,]   10   11   12
## [5,]   13   14   15
## [6,]   16   17   18
one<-rep(1,6)
cbind(zmat,one)
##               one
## [1,]  1  2  3   1
## [2,]  4  5  6   1
## [3,]  7  8  9   1
## [4,] 10 11 12   1
## [5,] 13 14 15   1
## [6,] 16 17 18   1
two<-rep(2,3)
rbind(two,zmat)
##     [,1] [,2] [,3]
## two    2    2    2
##        1    2    3
##        4    5    6
##        7    8    9
##       10   11   12
##       13   14   15
##       16   17   18
qr<-rbind(c(1,2),c(3,4))
qr
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
qc<-cbind(c(1,2),c(3,4))
qc
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4

避免降维

zmat<-matrix(1:18,nrow=6,ncol=3,byrow=TRUE)
zmat
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
## [4,]   10   11   12
## [5,]   13   14   15
## [6,]   16   17   18
zmat[,3]
## [1]  3  6  9 12 15 18
zmat[,3,drop=FALSE]
##      [,1]
## [1,]    3
## [2,]    6
## [3,]    9
## [4,]   12
## [5,]   15
## [6,]   18

数组

数组(array)是 R 中更一般的对象,矩阵是数组的一个特殊情形。数组可以是多维的。例如一个三维的数组可以包含行、列和层(layer) ,而一个矩阵只用行和列两个维度。

数组的创建

tree.id<-c("T1","T2","T3","T4")
variable<-c("dbh","height","crownwid")
year<-c("2001","2002","2003","2004")
multisurvey<-array(1:48,c(4,3,4),dimnames=list(tree.id,variable,year))
multisurvey
## , , 2001
## 
##    dbh height crownwid
## T1   1      5        9
## T2   2      6       10
## T3   3      7       11
## T4   4      8       12
## 
## , , 2002
## 
##    dbh height crownwid
## T1  13     17       21
## T2  14     18       22
## T3  15     19       23
## T4  16     20       24
## 
## , , 2003
## 
##    dbh height crownwid
## T1  25     29       33
## T2  26     30       34
## T3  27     31       35
## T4  28     32       36
## 
## , , 2004
## 
##    dbh height crownwid
## T1  37     41       45
## T2  38     42       46
## T3  39     43       47
## T4  40     44       48

数组的索引

multisurvey[1,,]
##          2001 2002 2003 2004
## dbh         1   13   25   37
## height      5   17   29   41
## crownwid    9   21   33   45
multisurvey[,1,]
##    2001 2002 2003 2004
## T1    1   13   25   37
## T2    2   14   26   38
## T3    3   15   27   39
## T4    4   16   28   40
multisurvey[,,1]
##    dbh height crownwid
## T1   1      5        9
## T2   2      6       10
## T3   3      7       11
## T4   4      8       12
multisurvey[2,2,]
## 2001 2002 2003 2004 
##    6   18   30   42
multisurvey[,2,2]
## T1 T2 T3 T4 
## 17 18 19 20
multisurvey[2,,2]
##      dbh   height crownwid 
##       14       18       22

数组的运算

行、列和维度

dim(multisurvey)
## [1] 4 3 4
nrow(multisurvey)
## [1] 4
ncol(multisurvey)
## [1] 3

长度

length(multisurvey)
## [1] 48

行名、列名和维度名

rownames(multisurvey)
## [1] "T1" "T2" "T3" "T4"
colnames(multisurvey)
## [1] "dbh"      "height"   "crownwid"
dimnames(multisurvey)
## [[1]]
## [1] "T1" "T2" "T3" "T4"
## 
## [[2]]
## [1] "dbh"      "height"   "crownwid"
## 
## [[3]]
## [1] "2001" "2002" "2003" "2004"

数据框

数据框的创建

plot.no<-paste("P",1:10,sep="")
elevation<-c(1020,1164,1190,1212,1261,1270,1283,1312,1387,1393)
aspect<-c("SE20","W","NE34","S","W","SE45","NE40","W","SW55","E")
gradient<-c(35,31,37,40,35,30,23,40,38,35)
position<-c("Down","Down","Middle","Middle","Middle","Up","Down","Down","Up","Down")
density<-c(1025,1000,2075,1350,1750,1275,850,1025,1300,1050)
envpara<-data.frame(plot.no,elevation,aspect,gradient,position,density)
envpara
##    plot.no elevation aspect gradient position density
## 1       P1      1020   SE20       35     Down    1025
## 2       P2      1164      W       31     Down    1000
## 3       P3      1190   NE34       37   Middle    2075
## 4       P4      1212      S       40   Middle    1350
## 5       P5      1261      W       35   Middle    1750
## 6       P6      1270   SE45       30       Up    1275
## 7       P7      1283   NE40       23     Down     850
## 8       P8      1312      W       40     Down    1025
## 9       P9      1387   SW55       38       Up    1300
## 10     P10      1393      E       35     Down    1050

数据框的索引

envpara[1,1]
## [1] "P1"
envpara[,2:3]
##    elevation aspect
## 1       1020   SE20
## 2       1164      W
## 3       1190   NE34
## 4       1212      S
## 5       1261      W
## 6       1270   SE45
## 7       1283   NE40
## 8       1312      W
## 9       1387   SW55
## 10      1393      E
envpara[2:3,]
##   plot.no elevation aspect gradient position density
## 2      P2      1164      W       31     Down    1000
## 3      P3      1190   NE34       37   Middle    2075
envpara[2,2:3]
##   elevation aspect
## 2      1164      W

数据框的运算

subset的用法

subset(envpara,elevation>=1200) #提取 envpara 数据中海拔大于 1200 m 的样地数据
##    plot.no elevation aspect gradient position density
## 4       P4      1212      S       40   Middle    1350
## 5       P5      1261      W       35   Middle    1750
## 6       P6      1270   SE45       30       Up    1275
## 7       P7      1283   NE40       23     Down     850
## 8       P8      1312      W       40     Down    1025
## 9       P9      1387   SW55       38       Up    1300
## 10     P10      1393      E       35     Down    1050
subset(envpara,position=="Down") #提取 envpara 数据中坡位处于下部的样地数据
##    plot.no elevation aspect gradient position density
## 1       P1      1020   SE20       35     Down    1025
## 2       P2      1164      W       31     Down    1000
## 7       P7      1283   NE40       23     Down     850
## 8       P8      1312      W       40     Down    1025
## 10     P10      1393      E       35     Down    1050
subset(envpara,elevation>=1200&position=="Down") #提取 envpara 数据中海拔大于1200 m且坡位处于下部的样地数据
##    plot.no elevation aspect gradient position density
## 7       P7      1283   NE40       23     Down     850
## 8       P8      1312      W       40     Down    1025
## 10     P10      1393      E       35     Down    1050

使用rbindcbind

meandbh<-c(19.4,18.45,11.36,15.88,11.9,12.76,9.33,13.87,10.23,16.42)
envpara.addrow<-cbind(envpara,meandbh)
newcol<-data.frame("P11",1437,"SW70",15,"Middle",1275)
names(newcol)<-names(envpara)
envpara.addcol<-rbind(envpara,newcol)

使用 apply

envnum<-envpara[,c(2,4,6)]
apply(envnum,1,mean)
##  [1]  693.3333  731.6667 1100.6667  867.3333 1015.3333  858.3333  718.6667
##  [8]  792.3333  908.3333  826.0000
rowMeans(envnum)
##  [1]  693.3333  731.6667 1100.6667  867.3333 1015.3333  858.3333  718.6667
##  [8]  792.3333  908.3333  826.0000
apply(envnum,1,sum)
##  [1] 2080 2195 3302 2602 3046 2575 2156 2377 2725 2478
rowSums(envnum)
##  [1] 2080 2195 3302 2602 3046 2575 2156 2377 2725 2478
apply(envnum,2,mean)
## elevation  gradient   density 
##    1249.2      34.4    1270.0
colMeans(envnum)
## elevation  gradient   density 
##    1249.2      34.4    1270.0
apply(envnum,2,sum)
## elevation  gradient   density 
##     12492       344     12700
colSums(envnum)
## elevation  gradient   density 
##     12492       344     12700

列表

列表的创建

surveydata<-list(meandbh=meandbh,envpara=envpara)
surveydata
## $meandbh
##  [1] 19.40 18.45 11.36 15.88 11.90 12.76  9.33 13.87 10.23 16.42
## 
## $envpara
##    plot.no elevation aspect gradient position density
## 1       P1      1020   SE20       35     Down    1025
## 2       P2      1164      W       31     Down    1000
## 3       P3      1190   NE34       37   Middle    2075
## 4       P4      1212      S       40   Middle    1350
## 5       P5      1261      W       35   Middle    1750
## 6       P6      1270   SE45       30       Up    1275
## 7       P7      1283   NE40       23     Down     850
## 8       P8      1312      W       40     Down    1025
## 9       P9      1387   SW55       38       Up    1300
## 10     P10      1393      E       35     Down    1050

列表的索引

surveydata[1:2]
## $meandbh
##  [1] 19.40 18.45 11.36 15.88 11.90 12.76  9.33 13.87 10.23 16.42
## 
## $envpara
##    plot.no elevation aspect gradient position density
## 1       P1      1020   SE20       35     Down    1025
## 2       P2      1164      W       31     Down    1000
## 3       P3      1190   NE34       37   Middle    2075
## 4       P4      1212      S       40   Middle    1350
## 5       P5      1261      W       35   Middle    1750
## 6       P6      1270   SE45       30       Up    1275
## 7       P7      1283   NE40       23     Down     850
## 8       P8      1312      W       40     Down    1025
## 9       P9      1387   SW55       38       Up    1300
## 10     P10      1393      E       35     Down    1050
surveydata[1]
## $meandbh
##  [1] 19.40 18.45 11.36 15.88 11.90 12.76  9.33 13.87 10.23 16.42
surveydata$meandbh
##  [1] 19.40 18.45 11.36 15.88 11.90 12.76  9.33 13.87 10.23 16.42
surveydata[["meandbh"]]
##  [1] 19.40 18.45 11.36 15.88 11.90 12.76  9.33 13.87 10.23 16.42
surveydata[[1]]
##  [1] 19.40 18.45 11.36 15.88 11.90 12.76  9.33 13.87 10.23 16.42
surveydata$meandbh[5]
## [1] 11.9
surveydata[["meandbh"]][5]
## [1] 11.9
surveydata[[1]][5]
## [1] 11.9
surveydata$envpara
##    plot.no elevation aspect gradient position density
## 1       P1      1020   SE20       35     Down    1025
## 2       P2      1164      W       31     Down    1000
## 3       P3      1190   NE34       37   Middle    2075
## 4       P4      1212      S       40   Middle    1350
## 5       P5      1261      W       35   Middle    1750
## 6       P6      1270   SE45       30       Up    1275
## 7       P7      1283   NE40       23     Down     850
## 8       P8      1312      W       40     Down    1025
## 9       P9      1387   SW55       38       Up    1300
## 10     P10      1393      E       35     Down    1050
surveydata[["envpara"]]
##    plot.no elevation aspect gradient position density
## 1       P1      1020   SE20       35     Down    1025
## 2       P2      1164      W       31     Down    1000
## 3       P3      1190   NE34       37   Middle    2075
## 4       P4      1212      S       40   Middle    1350
## 5       P5      1261      W       35   Middle    1750
## 6       P6      1270   SE45       30       Up    1275
## 7       P7      1283   NE40       23     Down     850
## 8       P8      1312      W       40     Down    1025
## 9       P9      1387   SW55       38       Up    1300
## 10     P10      1393      E       35     Down    1050
surveydata[[2]]
##    plot.no elevation aspect gradient position density
## 1       P1      1020   SE20       35     Down    1025
## 2       P2      1164      W       31     Down    1000
## 3       P3      1190   NE34       37   Middle    2075
## 4       P4      1212      S       40   Middle    1350
## 5       P5      1261      W       35   Middle    1750
## 6       P6      1270   SE45       30       Up    1275
## 7       P7      1283   NE40       23     Down     850
## 8       P8      1312      W       40     Down    1025
## 9       P9      1387   SW55       38       Up    1300
## 10     P10      1393      E       35     Down    1050
surveydata$envpara[2,5]
## [1] "Down"
surveydata[["envpara"]][2,5]
## [1] "Down"
surveydata[[2]][2,5]
## [1] "Down"

列表的运算

获取长度

length(surveydata)
## [1] 2
length(surveydata[1])
## [1] 1
length(surveydata[[1]])
## [1] 10
length(surveydata[2])
## [1] 1
length(surveydata[[2]])
## [1] 6

增加或删除列表元素

surveydata.new<-c(location="Qingling",surveydata)
surveydata.new
## $location
## [1] "Qingling"
## 
## $meandbh
##  [1] 19.40 18.45 11.36 15.88 11.90 12.76  9.33 13.87 10.23 16.42
## 
## $envpara
##    plot.no elevation aspect gradient position density
## 1       P1      1020   SE20       35     Down    1025
## 2       P2      1164      W       31     Down    1000
## 3       P3      1190   NE34       37   Middle    2075
## 4       P4      1212      S       40   Middle    1350
## 5       P5      1261      W       35   Middle    1750
## 6       P6      1270   SE45       30       Up    1275
## 7       P7      1283   NE40       23     Down     850
## 8       P8      1312      W       40     Down    1025
## 9       P9      1387   SW55       38       Up    1300
## 10     P10      1393      E       35     Down    1050
surveydata.new$location<-NULL
surveydata.new
## $meandbh
##  [1] 19.40 18.45 11.36 15.88 11.90 12.76  9.33 13.87 10.23 16.42
## 
## $envpara
##    plot.no elevation aspect gradient position density
## 1       P1      1020   SE20       35     Down    1025
## 2       P2      1164      W       31     Down    1000
## 3       P3      1190   NE34       37   Middle    2075
## 4       P4      1212      S       40   Middle    1350
## 5       P5      1261      W       35   Middle    1750
## 6       P6      1270   SE45       30       Up    1275
## 7       P7      1283   NE40       23     Down     850
## 8       P8      1312      W       40     Down    1025
## 9       P9      1387   SW55       38       Up    1300
## 10     P10      1393      E       35     Down    1050
surveydata$location<-"Qingling"
surveydata
## $meandbh
##  [1] 19.40 18.45 11.36 15.88 11.90 12.76  9.33 13.87 10.23 16.42
## 
## $envpara
##    plot.no elevation aspect gradient position density
## 1       P1      1020   SE20       35     Down    1025
## 2       P2      1164      W       31     Down    1000
## 3       P3      1190   NE34       37   Middle    2075
## 4       P4      1212      S       40   Middle    1350
## 5       P5      1261      W       35   Middle    1750
## 6       P6      1270   SE45       30       Up    1275
## 7       P7      1283   NE40       23     Down     850
## 8       P8      1312      W       40     Down    1025
## 9       P9      1387   SW55       38       Up    1300
## 10     P10      1393      E       35     Down    1050
## 
## $location
## [1] "Qingling"
surveydata$location<-NULL
surveydata
## $meandbh
##  [1] 19.40 18.45 11.36 15.88 11.90 12.76  9.33 13.87 10.23 16.42
## 
## $envpara
##    plot.no elevation aspect gradient position density
## 1       P1      1020   SE20       35     Down    1025
## 2       P2      1164      W       31     Down    1000
## 3       P3      1190   NE34       37   Middle    2075
## 4       P4      1212      S       40   Middle    1350
## 5       P5      1261      W       35   Middle    1750
## 6       P6      1270   SE45       30       Up    1275
## 7       P7      1283   NE40       23     Down     850
## 8       P8      1312      W       40     Down    1025
## 9       P9      1387   SW55       38       Up    1300
## 10     P10      1393      E       35     Down    1050

apply 系列函数

lapply(list(1:3,25:29),sum)
## [[1]]
## [1] 6
## 
## [[2]]
## [1] 135
sapply(list(1:3,25:29),sum)
## [1]   6 135
lapply(list(1:3,25:29),mean)
## [[1]]
## [1] 2
## 
## [[2]]
## [1] 27
sapply(list(1:3,25:29),mean)
## [1]  2 27
envnum.lower<-envpara[,c(2,4,6)]
envnum.middle<-data.frame(
elevation=c(1437,1521,1533,1582,1587,1604,1618,1658,1665,1680),
gradient=c(15,42,28,38,35,32,33,29,33,30),
density=c(1275,1200,1425,1125,1400,1150,1400,2225,1400,1050))
envnum.high<-data.frame(
elevation=c(1702,1708,1710,1768,1810,1815,1835,1889,1957,1999),
gradient=c(25,35,33,20,27,39,44,30,23,33),
density=c(1075,1525,700,975,1275,1350,1700,1625,1750,1550))
envnum.total<-list(lower=envnum.lower,middle=envnum.middle,high=envnum.high)
lapply(envnum.total,rowSums)
## $lower
##  [1] 2080 2195 3302 2602 3046 2575 2156 2377 2725 2478
## 
## $middle
##  [1] 2727 2763 2986 2745 3022 2786 3051 3912 3098 2760
## 
## $high
##  [1] 2802 3268 2443 2763 3112 3204 3579 3544 3730 3582
lapply(envnum.total,function(x) apply(x,1,sum))
## $lower
##  [1] 2080 2195 3302 2602 3046 2575 2156 2377 2725 2478
## 
## $middle
##  [1] 2727 2763 2986 2745 3022 2786 3051 3912 3098 2760
## 
## $high
##  [1] 2802 3268 2443 2763 3112 3204 3579 3544 3730 3582
sapply(envnum.total,rowSums)
##       lower middle high
##  [1,]  2080   2727 2802
##  [2,]  2195   2763 3268
##  [3,]  3302   2986 2443
##  [4,]  2602   2745 2763
##  [5,]  3046   3022 3112
##  [6,]  2575   2786 3204
##  [7,]  2156   3051 3579
##  [8,]  2377   3912 3544
##  [9,]  2725   3098 3730
## [10,]  2478   2760 3582
sapply(envnum.total,function(x) apply(x,1,sum))
##       lower middle high
##  [1,]  2080   2727 2802
##  [2,]  2195   2763 3268
##  [3,]  3302   2986 2443
##  [4,]  2602   2745 2763
##  [5,]  3046   3022 3112
##  [6,]  2575   2786 3204
##  [7,]  2156   3051 3579
##  [8,]  2377   3912 3544
##  [9,]  2725   3098 3730
## [10,]  2478   2760 3582
lapply(envnum.total,rowMeans)
## $lower
##  [1]  693.3333  731.6667 1100.6667  867.3333 1015.3333  858.3333  718.6667
##  [8]  792.3333  908.3333  826.0000
## 
## $middle
##  [1]  909.0000  921.0000  995.3333  915.0000 1007.3333  928.6667 1017.0000
##  [8] 1304.0000 1032.6667  920.0000
## 
## $high
##  [1]  934.0000 1089.3333  814.3333  921.0000 1037.3333 1068.0000 1193.0000
##  [8] 1181.3333 1243.3333 1194.0000
lapply(envnum.total,function(x) apply(x,1,mean))
## $lower
##  [1]  693.3333  731.6667 1100.6667  867.3333 1015.3333  858.3333  718.6667
##  [8]  792.3333  908.3333  826.0000
## 
## $middle
##  [1]  909.0000  921.0000  995.3333  915.0000 1007.3333  928.6667 1017.0000
##  [8] 1304.0000 1032.6667  920.0000
## 
## $high
##  [1]  934.0000 1089.3333  814.3333  921.0000 1037.3333 1068.0000 1193.0000
##  [8] 1181.3333 1243.3333 1194.0000
sapply(envnum.total,rowMeans)
##           lower    middle      high
##  [1,]  693.3333  909.0000  934.0000
##  [2,]  731.6667  921.0000 1089.3333
##  [3,] 1100.6667  995.3333  814.3333
##  [4,]  867.3333  915.0000  921.0000
##  [5,] 1015.3333 1007.3333 1037.3333
##  [6,]  858.3333  928.6667 1068.0000
##  [7,]  718.6667 1017.0000 1193.0000
##  [8,]  792.3333 1304.0000 1181.3333
##  [9,]  908.3333 1032.6667 1243.3333
## [10,]  826.0000  920.0000 1194.0000
sapply(envnum.total,function(x) apply(x,1,mean))
##           lower    middle      high
##  [1,]  693.3333  909.0000  934.0000
##  [2,]  731.6667  921.0000 1089.3333
##  [3,] 1100.6667  995.3333  814.3333
##  [4,]  867.3333  915.0000  921.0000
##  [5,] 1015.3333 1007.3333 1037.3333
##  [6,]  858.3333  928.6667 1068.0000
##  [7,]  718.6667 1017.0000 1193.0000
##  [8,]  792.3333 1304.0000 1181.3333
##  [9,]  908.3333 1032.6667 1243.3333
## [10,]  826.0000  920.0000 1194.0000