构建数据框子集

因为数据框是由列向量组成、有着矩阵形式的列表,所以我们可以用两种操作方式来
访问数据框的元素和子集。
1.以列表形式构建数据框子集
如果把数据框看作是由向量组成的列表,我们可以沿用列表的操作方式来提取元素或
构建子集。
例如,可以使用$按列名来提取某一列的值,或者用[[符号按照位置提取。
df1$id
## [1] 1 2 3 4 5
df1[[1]]
## [1] 1 2 3 4 5
以列表形式构建子集完全适用于数据框,同时也会生成一个新的数据框。提取子集的
操作符([)允许我们用数值向量表示列的位置,用字符向量表示列名,或用逻辑向量指定
TRUE 和 FALSE 的选择标准,来取出相应的列。
df1[1]
## id
## a 1
## b 2
## c 3
## d 4
## e 5
df1[1:2]
## id level
## a 1 0
## b 2 2
## c 3 1
## d 4 -1
## e 5 -3
df1["level"]
## level
## a 0
## b 2
## c 1
## d -1
## e -3
df1[c("id", "score")]
## id score
## a 1 0.5
## b 2 0.2
## c 3 0.1
## d 4 0.5
## e 5 0.9
df1[c(TRUE, FALSE, TRUE)]
## id score
## a 1 0.5
## b 2 0.2
## c 3 0.1
## d 4 0.5
## e 5 0.9
2.以矩阵形式构建数据框子集
不过,以列表形式操作并不支持行选择。与此相反,以矩阵形式操作更加灵活。如果
我们将数据框看作矩阵,其二维形式的存取器可以很容易地获取一个子集的元素,同时支
持列选择和行选择。
换句话说,我们可以使用 [行,列] 指定行或列来提取数据框子集,[ , ] 内可以是数值向
量、字符向量或者逻辑向量。
例如,选择指定的列:
df1[, "level"]
## [1] 0 2 1 -1 -3
df1[, c("id","level")]
## id level
## a 1 0
## b 2 2
## c 3 1
## d 4 -1
## e 5 -3
df1[, 1:2]
## id level
## a 1 0
## b 2 2
## c 3 1
## d 4 -1
## e 5 -3
或者,选择指定的行:
df1[1:4,]
## id level score
## a 1 0 0.5
## b 2 2 0.2
## c 3 1 0.1
## d 4 -1 0.5
df1[c("c","e"),]
## id level score
## c 3 1 0.1
## e 5 -3 0.9
也可以同时选择指定的行和列:
df1[1:4, "id"]
## [1] 1 2 3 4
df1[1:3, c("id", "score")]
## id score
## a 1 0.5
## b 2 0.2
## c 3 0.1
以矩阵形式操作会自动简化结果,也就是说,如果只提取一列,那么结果将不再是数
据框形式,而仅仅返回这一列的值。即便结果只有单列,我们也可以结合使用两种操作方
式来保留数据框的形式:
df1[1:4,]["id"]
## id
## a 1
## b 2
## c 3
## d 4
这里,第 1 组方括号以矩阵形式提取数据框的前 4 行和所有的列。第 2 组方括号再以
列表形式提取列名为 id 的这一列,结果即表现为数据框的形式。
另一种方法是通过设定 drop = FALSE 避免简化结果:
df1[1:4, "id", drop = FALSE]
## id
## a 1
## b 2
## c 3
## d 4
如果想要数据框的子集总是保留数据框的形式,你可以设置 drop = FALSE;否则,
一些特殊情况(例如只选择提取一列)可能会导致意想不到的结果,你觉得将会得到一个
数据框,但却返回一个向量。
3.筛选数据
以下代码按照 score >= 0.5 筛选 df1 的行,并选择 id 和 level 两列:
df1$score >= 0.5
## [1] TRUE FALSE FALSE TRUE TRUE
df1[df1$score >= 0.5, c("id", "level")]
## id level
## a 1 0
## d 4 -1
## e 5 -3
以下代码按照行名必须在a、d或者e中的准则来筛选 df1的行,并选择id和score两列:
rownames(df1) %in% c("a", "d", "e")
## [1] TRUE FALSE FALSE TRUE TRUE
df1[rownames(df1) %in% c("a", "d", "e"), c("id", "score")]
## id score
## a 1 0.5
## d 4 0.5
## e 5 0.9
以上两个例子都以矩阵形式对数据框进行操作,根据逻辑向量选择行,字符向量选择列。

posted @ 2019-01-22 10:31  NAVYSUMMER  阅读(176)  评论(0编辑  收藏  举报
交流群 编程书籍