使用R中多个特定列的条件从数据框中提取行

时间:2014-02-03 17:11:28

标签: r dataframe selection

我有以下数据框df

         cat  dog  cow   X   box  bag
trait1    0    0    0    1    0    0               
trait2    1    0    1    2    0    0
trait3    0    0    0    0    0    0
trait4    1    3    1    1    0    0
trait5    0    0    0    1    2    1
trait6    0    0    0    1    0    0
trait7    0    0    0    1    0    1
  1. df开始,我想提取X唯一的所有特征,在这种情况下trait1trait6
  2. 此外,我想提取X与动物或物体唯一共享的所有特征。对于动物:trait2trait4。对象:trait5trait7
  3. 我尝试过这样的事情:

    animals<-c('cat','dog','cow')
    objects<-c('box','bag')
    df[df[,animals]==0 & df[,objects]==0 & df[,X]>=1, ]   # To get traits unique for X
    df[df[,animals]>=1 & df[,objects]==0 & df[,X]>=1, ]   # To get traits unique for X and animals
    df[df[,animals]==0 & df[,objects]==1 & df[,X]>=1, ]   # To get traits unique for X and objects
    

    但这并没有按计划进行。

1 个答案:

答案 0 :(得分:0)

更简单的版本,相同的结果:

animal.trait <- apply(df[, animals], 1, any)
obj.trait <- apply(df[, objects], 1, any)

df[!(obj.trait | animal.trait) & df$X, ]
#        cat dog cow X box bag
# trait1   0   0   0 1   0   0
# trait6   0   0   0 1   0   0
df[animal.trait & df$X, ]
#        cat dog cow X box bag
# trait2   1   0   1 2   0   0
# trait4   1   3   1 1   0   0
df[obj.trait & df$X, ]
#        cat dog cow X box bag
# trait5   0   0   0 1   2   1
# trait7   0   0   0 1   0   1

这是我对你想要的理解。如果X是唯一具有大于零的值的列,则特征对于X是唯一的。如果任何动物列的值大于零,则X和动物之间共享特征,并且X的值大于零。对象-X特征共享的逻辑相同。

要了解您的逻辑不起作用的原因,请检查您的临时条件。例如,在:

df[df[,animals]==0 & df[,objects]==0 & df[,X]>=1, ]

如果你看df[,animals]==0,你会得到:

#          cat   dog   cow
# trait1  TRUE  TRUE  TRUE
# trait2 FALSE  TRUE FALSE
# trait3  TRUE  TRUE  TRUE
# trait4 FALSE FALSE FALSE
# trait5  TRUE  TRUE  TRUE
# trait6  TRUE  TRUE  TRUE
# trait7  TRUE  TRUE  TRUE

这可能不是你以为你得到的。据推测,你希望得到一个7长度的向量,而不是这个矩阵。为了获得向量,您需要使用apply遍历每一行,并按行进行比较。


OLD VERSION

这应该做你想要的,虽然我不明白为什么第一个你包括特质5而不是6。

df[apply(df, 1, function(y) y["X"] >= 1 & all(y[names(y) != "X"] == 0)),]
df[apply(df, 1, function(y) any(y[animals]>=1) & !any(y[objects]>=1) & y["X"] >=1),]
df[apply(df, 1, function(y) any(y[objects]>=1) & !any(y[animals]>=1) & y["X"] >=1),]