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'])
我有一个长格式的数据框,每个 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'])