按列而不是按行过滤R数据

时间:2018-03-21 00:38:45

标签: r dataframe

我想过滤我的数据框,以便获得给定行具有特定值的所有列。

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

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