我想过滤我的数据框,以便获得给定行具有特定值的所有列。
DF
vec1 vec2 vec3
1 a aa d
2 b bb e
3 c cc f
4 1 1 2
例如,第4行中1
的所有列。
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
或第4行中除1
以外的所有列
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
答案 0 :(得分:4)
通常,人们使用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
注意:如果您按字段过滤表达式将包含多个列,则您不需要drop = FALSE
,但如果不是,则表示您不需要c()
。你依赖的习语应该考虑到这一点,因为你可能不知道有多少列符合你的条件。这就是为什么它在两种陈述中的原因。
编辑:
@thelatemail在评论中的建议也适用。对于我自己的风格,我不想使用DF[c(DF[4,] != 1)]
# vec3
# 1 d
# 2 e
# 3 f
# 4 2
来获取它的属性剥离效果,但您可能不想输入drop。
p
如果你使用其中任何一种,你会特别注意逗号。
答案 1 :(得分:1)
这听起来像是一个dplyr
问题,使用slice
的某种组合来挑选行,filter
根据某些值选择观察结果,但是你的问题并不清楚超出你想要做的事情。以下是一些例子:
library(dplyr)
> df %>% slice(n=4)
# A tibble: 1 x 3
vec1 vec2 vec3
<fct> <fct> <fct>
1 1 1 2
> df %>% slice(n=4) %>% filter(vec1==1)
# A tibble: 1 x 3
vec1 vec2 vec3
<fct> <fct> <fct>
1 1 1 2
> df %>% slice(n=4) %>% filter(vec2==1 && vec3==2)
# A tibble: 1 x 3
vec1 vec2 vec3
<fct> <fct> <fct>
1 1 1 2
> df %>% slice(n=4) %>% filter(vec2==1 && vec3==1)
# A tibble: 0 x 3
# ... with 3 variables: vec1 <fct>, vec2 <fct>, vec3 <fct>
> df %>% filter(vec1==1)
vec1 vec2 vec3
1 1 1 2