列表
创建列表和访问组件
在R中,可以使用list()函数进行列表的编辑,而提取列表对象时,经常使用双中括号进行
> a<-list(matrix(seq(from=-4,to=4,length.out=20)),c(F,T,T,T,F,T,T,F,F),c("don","qulxote"),c("LOW","MED","MED","HIGH"))
> a
[[1]]
[,1]
[1,] -4.0000000
[2,] -3.5789474
[3,] -3.1578947
[4,] -2.7368421
[5,] -2.3157895
[6,] -1.8947368
[7,] -1.4736842
[8,] -1.0526316
[9,] -0.6315789
[10,] -0.2105263
[11,] 0.2105263
[12,] 0.6315789
[13,] 1.0526316
[14,] 1.4736842
[15,] 1.8947368
[16,] 2.3157895
[17,] 2.7368421
[18,] 3.1578947
[19,] 3.5789474
[20,] 4.0000000
[[2]]
[1] FALSE TRUE TRUE TRUE FALSE TRUE TRUE FALSE FALSE
[[3]]
[1] "don" "qulxote"
[[4]]
[1] "LOW" "MED" "MED" "HIGH"
而当需要提取列表组件中的具体元素,方法同矩阵。下面给出两种方法:
> a[[1]][2]
[1] -3.578947
> a[[c(1,2)]]
[1] -3.578947
命名
对于列表组件的命名,可以使用names()函数,或者在创建组件时添加,如下:
> b<-list(facs=a[[2]],nums=c(3,2.1,3.3,4,1.5,4.9))
> b
$facs
[1] FALSE TRUE TRUE TRUE FALSE TRUE TRUE FALSE FALSE
$nums
[1] 3.0 2.1 3.3 4.0 1.5 4.9
names(b)<-c("facs","nums")
嵌套
对于列表来说,其组件依旧可以是一个列表,即在一个列表内嵌套一个列表,下面的例子即创建了一个名为“qfn”的列表作为列表b的列表组件
> b$qfn<-a
> b
$facs
[1] FALSE TRUE TRUE TRUE FALSE TRUE TRUE FALSE FALSE
$nums
[1] 3.0 2.1 3.3 4.0 1.5 4.9
$qfn
$qfn[[1]]
[,1]
[1,] -4.0000000
[2,] -3.5789474
[3,] -3.1578947
[4,] -2.7368421
[5,] -2.3157895
[6,] -1.8947368
[7,] -1.4736842
[8,] -1.0526316
[9,] -0.6315789
[10,] -0.2105263
[11,] 0.2105263
[12,] 0.6315789
[13,] 1.0526316
[14,] 1.4736842
[15,] 1.8947368
[16,] 2.3157895
[17,] 2.7368421
[18,] 3.1578947
[19,] 3.5789474
[20,] 4.0000000
$qfn[[2]]
[1] FALSE TRUE TRUE TRUE FALSE TRUE TRUE FALSE FALSE
$qfn[[3]]
[1] "don" "qulxote"
$qfn[[4]]
[1] "LOW" "MED" "MED" "HIGH"
数据框
数据框的创建
在R中可以使用data.frame()函数对数据框进行创建。当然也可以对每一列的先进行编辑,再将他们合并起来
若里面有因子型数据,则需要多添加一个c函数在factor()函数内,如下sex项。不过data.frame()函数会将字符串因素自动转化为因子,若要保留字符串格式,则需要添加参数stringAsFactors=FALSE 。
> mydata<-data.frame(person=c("a","b","c","d","e"),age=c(42,40,17,14,1),sex=factor(c("M","F","F","F","M")))
> mydata
person age sex
1 a 42 M
2 b 40 F
3 c 17 F
4 d 14 F
5 e 1 M
添加数据列,合并数据框
对于一个数据框,假设名字为w,,要添加一列数据,数据列名为z,则可以直接使用w$z创建添加
> mydata$id<-c(1:5)
> mydata
person age sex id
1 a 42 M 1
2 b 40 F 2
3 c 17 F 3
4 d 14 F 4
5 e 1 M 5
合并数据框的函数有两个,
cbind(),用于添加列
rbind(),用于添加行
但当数据框添加部分的行或者列的数量不同,则会报错,同时行名或者列名不同也会报错,只需要使用names()函数对两个数据框的行名或列明进行再次命名则可。
使用逻辑值提取数据框子集
(注意有个逗号),若忘记列编号,可以使用变量名代替数值进行索引,同时添加负号即可实现删除某列
> mydata[mydata$sex=="M",]
person age sex id
1 a 42 M 1
5 e 1 M 5
> mydata[mydata$sex=="M",-3]
person age id
1 a 42 1
5 e 1 5
练习题
> #练习5.1
> rm(list=ls())
> #a.创建一个列表,以此包括以下内容:-4~4等步长并且有20个数字的序列;逻辑性向量c(F,T,T,T,F,T,T,F,F)按列填充构成一个3×3阶矩阵;由字符串"don"和"qulxote"构成一个字符型向量;含有观测值c("LOW","MED","MED","HIGH")的因子向量。然后执行下面的操作。
> #i.按照顺序提取逻辑性矩阵中第二列和第三列的第二行和第一行的元素。
> a<-list(matrix(seq(from=-4,to=4,length.out=20),nrow = 4,ncol = 5),c(F,T,T,T,F,T,T,F,F),c("don","qulxote"),c("LOW","MED","MED","HIGH"))
> a[[1]][c(2,3),c(2,1)]
[,1] [,2]
[1,] -1.894737 -3.578947
[2,] -1.473684 -3.157895
> #ii.使用sub函数,将列表中的"qulxote"换成"Qulxote","don"换成"Don"。
> sub(pattern="qulxote",replacement="Qulxote",x=a[[3]])
[1] "don" "Qulxote"
> sub(pattern="don",replacement="Don",x=a[[3]])
[1] "Don" "qulxote"
> #iii提取-4~4中所有大于1的值。
> a[[1]][a[[1]]>1]
[1] 1.052632 1.473684 1.894737 2.315789 2.736842 3.157895 3.578947 4.000000
> #iv.使用which函数提取因子变量中"MED"的水平索引。
> which(a[[4]]=="MED")
[1] 2 3
> #b.创建一个新列表,包括下列数组:a题中的因子向量,命名为"facs";组件的数值型向量c(3,2.1,3.3,4,1.5,4.9),命名为"nums";由a题中列表的前3个组件构成嵌套列表,命名为"oldist"。然后执行下列的操作。
> #i.提取facs中与nums中大于或等于3相对应的元素。
> b<-list(facs=a[[2]],nums=c(3,2.1,3.3,4,1.5,4.9))
> b$oldist<-list(matrix(seq(from=-4,to=4,length.out=20),nrow = 4,ncol = 5),c(F,T,T,T,F,T,T,F,F),c("don","qulxote"))
> b$nums[b$nums>=3]
[1] 3.0 3.3 4.0 4.9
> #ii.给列表添加一个名为"flags"的组件,为一个长度为6的逻辑型变量,由oldist组件的逻辑型矩阵的第三列重复两次得到。
> b$flags<-rep(b$oldist[[1]][,3],2)
> #iii.将"oldist"中的字符串向量改写为单个字符串向量"Don Quixote"。
> b$oldist[[3]]<-"Don Quixote"
> > #练习5.2
> rm(list=ls())
> #a.创建数据框,命名为dframe,其中字符串变量person=c("Stan","Francine","Steve","Roger","Haylay","Klaus"),因子变量sex=c("M","F","M","M","F","M"),因子变量funny=c("High","Med","Low","High","Med","Med")
> dframe<-data.frame(person=c("Stan","Francine","Steve","Roger","Haylay","Klaus"),sex=factor(c("M","F","M","M","F","M")),funny=factor(c("High","Med","Low","High","Med","Med")),stringsAsFactors=FALSE)
> #b.Stan和Francine都是41岁,Steve是15岁,Hayley是21岁,Klaus是60岁。Roger年龄为1600岁。根据这些信息为dframe添加一个新变量age。
> dframe$age<-c(41,41,15,60,1600,21)
> #c.用一行代码提取幽默程度为Med或High的所有女性的名字和年龄。
> dframe[dframe$funny=="Med" | dframe$funny=="High"& dframe$sex=="F",]
person sex funny age
2 Francine F Med 41
5 Haylay F Med 1600
6 Klaus M Med 21
> #d.改变数据框顺序,第一列为person,第二列为age,第三列是sex,第四列是funny。
> dframe[,c("person","age","sex","funny")]
person age sex funny
1 Stan 41 M High
2 Francine 41 F Med
3 Steve 15 M Low
4 Roger 60 M High
5 Haylay 1600 F Med
6 Klaus 21 M Med