簡體   English   中英

使用R中多個特定列上的條件從數據框中提取行

[英]Extracting rows from dataframe with conditions on multiple specific columns in R

我有以下數據框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

我已經嘗試過這樣的事情:

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和動物之間將共享一個特征。 對象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),]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM