列表可以包含不同类型的对象,也就是说,列表不是将某些具体的值组织起来,而是组织R对象。列表将数据组织在一个一维集合中。
列表非常好用,因为它可以装任何类型的对象,不要求数据之间是同质的。
创建列表
list()
> list1 <- list(100:130, "R", list(TRUE, FALSE))
> list1
[[1]]
[1] 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
[18] 117 118 119 120 121 122 123 124 125 126 127 128 129 130
[[2]]
[1] "R"
[[3]]
[[3]][[1]]
[1] TRUE
[[3]][[2]]
[1] FALSE
以上代码,创建了一个列表,其中第一个元素是一个长度为31的数值型向量,第二个元素是一个长度为1的字符串,而第三个元素是一个长度为2的新列表。list函数创建列表的方式与c函数创建向量的方式相似,不同的元素使用逗号分开。
解释上述的输出结果:双中括号索引,如[[1]]表示展示的内容来自列表的第一个元素。单中括号索引,表示在其之后显示的内容来自列表某元素的哪一个子元素。例如,100是该列表抵押给元素的第一个子元素。"R"是列表第二个元素的第一个子元素。
列表中的每个成分是一个对象,比如向量、数据框、矩阵、列表
以下是具体的例子:
> lst <- list(numbers = c(1,2), logical = TRUE, strings = c("a", "b", "c"))
> lst
$numbers
[1] 1 2
$logical
[1] TRUE
$strings
[1] "a" "b" "c"
> lst[[1]]
[1] 1 2
> lst$numbers
[1] 1 2
列表子集:从列表中提取多个成分及内容,得到的是列表,可以使用一个括号[ ]来提取列表子集。在[ ]中可以用字符向量表示成分名称,用数值向量表示成分位置, 或者用逻辑向量指定是否选择来提取列表成分。
> lst <- list(numbers = c(1,2), logical = TRUE, strings = c("a", "b", "c"))
> lst
$numbers
[1] 1 2
$logical
[1] TRUE
$strings
[1] "a" "b" "c"
> lst[1]
$numbers
[1] 1 2
数据框可以看作类似是EXCEL表,各列数据类型允许不同,每一列数据类型相同。在R中数据框那个是特殊的列表,其每个列表元素都是一个长度相同的向量。
函数data.frame()可以生成数据框,只适合小数据场景,数据量比较大的时候,建议将数据导入到R中。
> d <- data.frame(
+ name=c("李明", "张聪", "王建"),
+ age=c(30, 35, 28),
+ height=c(180, 162, 175),
+ stringsAsFactors=FALSE)
> print(d)
name age height
1 李明 30 180
2 张聪 35 162
3 王建 28 175
data.frame()函数会将字符型列转换成因子,加选项stringsAsFactors=FALSE可以避免这样的转换。
访问第二列,是一个向量:d[[2]],d[["age"]], d[,2], d[, "age"] (注:后面两种做法与tibble不兼容,应避免使用)
> d[,"age"]
[1] 30 35 28
> d[[2]]
[1] 30 35 28
> d[["age"]]
[1] 30 35 28
> d[,2]
[1] 30 35 28
> d[,"age"]
[1] 30 35 28
访问数据框的第二个元素,此时把数据框当作列表来看,返回的结果仍是一个数据框。
> d[2]
age
1 30
2 35
3 28
> d["age"]
age
1 30
2 35
3 28
> class(d[2])
[1] "data.frame"
数据框是一个随着R语言前身S语言继承下来的概念,现在已经有一些不足之处,tibble包提供了tibble类,这是数据框的一个改进版本。
Hadley在tibble包中引入了一种tibble数据框,以代替data.frame,并且tidyverse包都是基于tibble数据框的。
创建数据框tibble,注只适应于数据量比较小的情况。
> t.bp <- tibble(
+ `序号`=c(1,5,6,9,10,15),
+ `收缩压`=c(145, 110, "未测", 150, "拒绝", 115))
> t.bp
# A tibble: 6 × 2
序号 收缩压
1 1 145
2 5 110
3 6 未测
4 9 150
5 10 拒绝
6 15 115
> t.bp2 <- tribble(
+ ~`序号`,~`收缩压`,
+ 1,145,
+ 5,110,
+ 6,NA,
+ 9,150,
+ 10,NA,
+ 15,115
+ )
> t.bp2
# A tibble: 6 × 2
序号 收缩压
1 1 145
2 5 110
3 6 NA
4 9 150
5 10 NA
6 15 115
注意:tribble() 中数据每行末尾也需要有逗号,最后一行末尾没有逗号。
tibble比数据框好的地方:
双中括号,访问元素的内容;
单中括号,访问数据框子集。
> t.bp2[[1]]
[1] 1 5 6 9 10 15
> t.bp2[1]
# A tibble: 6 × 1
序号
1 1
2 5
3 6
4 9
5 10
6 15
由于数据框是特殊的列表,所以二者可以使用一套访问方法,即
参考: