小技巧:当我们输命令时,一行不足以容纳我们想要书写的内容时,我们可以按shift+enter键将一个命令分成多行
1.2.9 列表
R列表是以其他对象为成分的有序集合。列表的成分与向量的元素不同,他们不一定是同一数据类型、模式或者相同长度。
> mylist<-list(sid=34453,sname="John",marks=c(14.3,12,15))
> mylist
$sid
[1] 34453
$sname
[1] "John"
$marks
[1] 14.3 12.0 15.0
对象mylist由三个成分组成:第一个是名称为sid的数值;第二个是名称为sname的字符串;第三个是名称为marks的数值向量。
可以通过下面的索引方式得到列表的元素:
> mylist[[1]]
[1] 34453
> mylist[[3]]
[1] 14.3 12.0 15.0
> mylist$sid
[1] 34453
> mylist$marks
[1] 14.3 12.0 15.0
注意,mylist[1]与mylist[[1]]是有区别的,mylist[1]是获取列表mylist的第一个成分构成的子列表。相反,mylist[[1]]提取列表的第一个组件的值,结果不再是一个列表。
> mode(mylist[1])
[1] "list"
> mode(mylist[[1]])
[1] "numeric"
列表成分的名称实际上是列表的一个属性,它可以像向量元素名那样进行操作:
> names(mylist)
[1] "sid" "sname" "marks"
> names(mylist)<-c("Sid","Sname","Marks")
> names(mylist)
[1] "Sid" "Sname" "Marks"
也可以通过添加附加元素的方式来扩展列表:
> mylist$pname<-c("xxx","yyy")
> mylist
$Sid
[1] 34453
$Sname
[1] "John"
$Marks
[1] 14.3 12.0 15.0
$pname
[1] "xxx" "yyy"
剔除列表的成分:
> mylist<-mylist[-4]
> mylist
$Sid
[1] 34453
$Sname
[1] "John"
$Marks
[1] 14.3 12.0 15.0
通过函数c()来合并列表:
> other<-list(age=19,sex="male")
> lst<-c(mylist,other)
> lst
$Sid
[1] 34453
$Sname
[1] "John"
$Marks
[1] 14.3 12.0 15.0
$age
[1] 19
$sex
[1] "male"
可以通过函数unlist()把列表中的所有元素转换为向量元素,转换后的向量元素的个数和列表中的所有数据对象的个数相同。把列表中的不同类型的数据转为统一的类型。
> unlist(mylist)
Sid Sname Marks1 Marks2 Marks3
"34453" "John" "14.3" "12" "15"
数据框是R软件中用于存储数据表的一种数据结构。数据框的每列可以有不同数据类型的数据。与列表类似。
创建数据框:
> mydataset<-data.frame(site=c("a","b","c"),season=c("Winter","Summer","Spring"),
+ ph=c(7.4,3.6,2.8))
> mydataset
site season ph
1 a Winter 7.4
2 b Summer 3.6
3 c Spring 2.8
可以像矩阵那样访问数据框的元素:
> mydataset[3,2]
[1] Spring
Levels: Spring Summer Winter
因为season列的所有元素为字符型,因而该列被转换为因子类型
也可以用列名来获取数据框的一列数据:
> mydataset$site
[1] a b c
Levels: a b c
可以利用R的数据子集的优势来方便的访问数据框中的数据:
> mydataset[mydataset$ph>7,]
site season ph
1 a Winter 7.4
函数attach()可以直接访问数据框的列,无需添加相应的数据框名:
> attach(mydataset)
> mydataset[ph>7,]
site season ph
1 a Winter 7.4
> season
[1] Winter Summer Spring
Levels: Spring Summer Winter
函数detach()禁止直接访问数据框的列。
> detach(mydataset)
> season
Error: object 'season' not found
函数subset()可以对数据框进行简单的查询:
> subset(mydataset,ph>7)
site season ph
1 a Winter 7.4
> subset(mydataset,season=="Summer",)
site season ph
2 b Summer 3.6
如果要改变数据框中数据的值,只能通过以下方式:
> mydataset[mydataset$season=="Summer","ph"]<-mydataset[mydataset$season=="Summer","ph"]+1
> mydataset
site season ph
1 a Winter 7.4
2 b Summer 4.6
3 c Spring 2.8
与列表类似,可以在数据框中加入新列,只是新列必须和已有的数据框有相同的函数,
> mydataset$new<-c("n1","n2","n3")
> mydataset
site season ph new
1 a Winter 7.4 n1
2 b Summer 4.6 n2
3 c Spring 2.8 n3
获取数据框的行数和列数:
> nrow(mydataset)
[1] 3
> ncol(mydataset)
[1] 4
构建新函数
R允许用户构建新函数,在创建该函数之前,我们需要检查R中是否已经有一个同名的函数存在。如果的确有同名的函数存在,R会把已经存在的R函数对用户隐藏起来。
> f<-function(x){
+ for(i in 1:10){
+ res<-x*i
+ cat(x,"*",i,"=",res,"\n")
+ }
+ }
> f(2)
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18
2 * 10 = 20