【问题标题】:R - Deleting all consequent ID rows if certain value in other column is metR - 如果满足其他列中的特定值,则删除所有后续 ID 行
【发布时间】:2021-05-19 08:04:31
【问题描述】:

我有一个长格式的数据框,每个 id 包含多个条目。我还有一个条件列,它可以是“应用条件”、“控制条件”或 NA。每个 id 至少有一个“应用条件”或“控制条件”条目,但通常其余的都是 NA。现在我需要过滤掉所有属于 app 条件的 id 行。所以我需要类似:if condition == "App condition" for id 5,删除 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))

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

有人可以帮忙吗?

非常感谢!

【问题讨论】:

  • 能否使用which为条件为TRUE时创建索引,然后将索引传递给filter
  • 你能添加代码行吗?我只是从更高级的 R 东西开始,还没有真正掌握过滤器和过滤器:)

标签: r filter dplyr long-integer


【解决方案1】:

使用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'])

【讨论】:

  • 这行得通,谢谢!我认为所有其他方法现在也可以工作,因为我发现我的 id 列包含一些空格用于 NA 行,因此 R 与后续 ID 不匹配。谢谢大家!
【解决方案2】:

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 上复制了它,但奇怪的是,在我原来的 df 上,它仍然留下了 NA 的行,但属于应用程序条件。但我想我现在可以尝试再次删除条件列中只有 NA 值的所有 id 行。编辑:没关系,如果我运行完全相同的代码,但这次使用“控制条件”保留 id,它会从条件列中删除所有 NA 行,以及我需要保留的行
  • 编辑:我意识到我的 ID 行有一些空格,所以 R 没有匹配正确的 ID。这很好用!谢谢!
【解决方案3】:

我曾经做过类似的事情

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 替换为条件 :)

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 2018-12-13
    • 2022-01-12
    相关资源
    最近更新 更多