我想过滤我的数据框,以便获得给定行具有特定值的所有列。
DF
vec1 vec2 vec3
1 a aa d
2 b bb e
3 c cc f
4 1 1 2
Run Code Online (Sandbox Code Playgroud)
例如,1第 4 行中的所有列。
DF[4,1]==1 and DF[4,2]==1
# These both evaluate to TRUE. I want those columns.
vec1 vec2
1 a aa
2 b bb
3 c cc
4 1 1
Run Code Online (Sandbox Code Playgroud)
1 或除第 4 行以外的所有列
DF[4,3]==1
# This evaluates to FALSE. So this would go in a separate data frame
vec3
1 d
2 e
3 f
4 2
Run Code Online (Sandbox Code Playgroud)
一般来说,人们使用 data.frames 及其子元素的方式,通常是相反的。列是变量,行是这些变量的观察结果。您可以过滤数据框,仅查找具有特定变量(列)值的观测值(行)。这并不典型,但我想你也可以反过来做。
按列而不是行过滤:
DF <- data.frame(vec1 = c("a", "b", "c", 1), vec2 = c("aa", "bb", "cc", 1), vec3 = c("d", "e", "f", 2))
DF
# vec1 vec2 vec3
# 1 a aa d
# 2 b bb e
# 3 c cc f
# 4 1 1 2
DF[,DF[4,] == 1, drop = FALSE]
# vec1 vec2
# 1 a aa
# 2 b bb
# 3 c cc
# 4 1 1
DF[,DF[4,] != 1, drop = FALSE]
# vec3
# 1 d
# 2 e
# 3 f
# 4 2
Run Code Online (Sandbox Code Playgroud)
注意:如果按列过滤表达式将包含多个列,则不需要drop = FALSE,但如果不是,则需要。您所依赖的习惯用法应该考虑到这一点,因为您可能无法提前知道有多少列可以满足您的条件。这就是为什么它出现在这两个声明中。
编辑:@thelatemail 在评论中的建议也有效。对于我自己的风格,我不喜欢使用c()它的属性剥离效果,但您可能更喜欢不必键入 drop。
DF[c(DF[4,] != 1)]
# vec3
# 1 d
# 2 e
# 3 f
# 4 2
Run Code Online (Sandbox Code Playgroud)
如果您使用其中任何一个,您需要特别注意逗号。
| 归档时间: |
|
| 查看次数: |
1790 次 |
| 最近记录: |