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

Ste*_*Axo 2 r dataframe

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

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)

De *_*ica 5

一般来说,人们使用 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)

如果您使用其中任何一个,您需要特别注意逗号。