R - 如果满足其他列中的特定值,则删除所有后续 ID 行

R - Deleting all consequent ID rows if certain value in other column is met

我有一个长格式的数据框,每个 ID 包含多个条目。我还有一个条件列,它是“应用程序条件”、“控制条件”或 NA。每个id至少有一个“应用条件”或“控制条件”条目,但通常其余的都是NA。现在我需要过滤掉所有属于应用条件的 id 行。所以我需要类似的东西:如果 id 5 的条件 == "App condition",删除 id 5 的所有行。

我的 df 看起来像这样:

ID Condition ....
A App condition
A NA
A NA
B Control condition
B NA
B Control condition
C NA
C App condition
D NA
D Control condition

而且我想保留所有至少有一个“控制条件”条目的 ID。所以基本上是这样的:

ID Condition ....
B Control condition
B NA
B Control condition
D NA
D Control condition

到目前为止,我的方法是将 dplyr 与

一起使用
df <- df %>% 
   group_by(id) %>%
   filter(any(condition != "App condition")|is.na(condition))

但这仍然是 returns 属于应用条件的 ID,只是删除了这些行,以便相同 ID 的 NA 行仍保留在数据框中。

有人可以帮忙吗?

非常感谢!

data.table接近

示例数据

library(data.table)
DT <- fread('ID,Condition
A,"App condition"
A,NA
A,NA
B,"Control condition"
B,NA
B,"Control condition"
C,NA
C,"App condition"
D,NA
D,"Control condition"')

代码

DT[!ID %in% DT[ Condition == "App condition", ID], ]

输出

#    ID         Condition
# 1:  B Control condition
# 2:  B              <NA>
# 3:  B Control condition
# 4:  D              <NA>
# 5:  D Control condition

我曾经做过类似的事情

df = as.data.frame(cbind(c('a','a','a','b','b','b','c','c','d','d'),c('AC',NA,NA,'CC',NA,'CC',NA,'AC',NA,'CC')))

df = df[-which(df$V1%in%df[which(df$V2=='AC'),'V1']),]

后来是这样的

   V1   V2
4   b   CC
5   b <NA>
6   b   CC
9   d <NA>
10  d   CC

在您的情况下,只需将 V1 替换为 ID,将 V2 替换为条件:)

希望对您有所帮助

使用dplyr

library(dplyr)

df %>%
  group_by(ID) %>%
  filter(any(Condition %in% 'Control condition')) %>%
  ungroup

#  ID    Condition        
#  <chr> <chr>            
#1 B     Control condition
#2 B     NA               
#3 B     Control condition
#4 D     NA               
#5 D     Control condition

在基础 R 中:

subset(df, ID %in% ID[Condition %in%'Control condition'])