我有以下dataframe 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
- 从
df
,我想提取X
唯一特征,在这种情况下为trait1
和trait6
。 - 此外,我想提取
X
与动物或物体独特共享的所有特征。用于动物:trait2
和trait4
。对于对象:trait5
和trait7
我尝试了这样的事情:
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
但这并没有按计划进行。
更简单的版本,相同的结果:
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和动物之间共享特征。object-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
进行每行,并以每行进行比较。
旧版本
这应该做您想做的事,尽管我不明白为什么要为第一个而不是特质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),]