如果满足一行的条件,则删除多行

Posted

技术标签:

【中文标题】如果满足一行的条件,则删除多行【英文标题】:Remove multiple rows if condition for one row is met 【发布时间】:2021-06-06 10:51:04 【问题描述】:

我有以下数据集:

ID   value
abc    1
abc    NA
abc    2
def    5
def    1 
def    4

我知道如何识别包含 NA 的行的 ID。 如果一行包含 NA,我想要做的是删除所有具有 ID 的行。 在这种情况下: abc 的一行显示 NA,因此 ID = abc 的所有行都应删除,因此数据框如下所示:

ID   value
def    5
def    1 
def    4

【问题讨论】:

使用dplyrdf %>% group_by(ID) %>% filter(all(!is.na(value))) 【参考方案1】:

data.table 选项

> setDT(df)[, .SD[!any(is.na(value))], ID]
    ID value
1: def     5
2: def     1
3: def     4

数据

> dput(df)
structure(list(ID = c("abc", "abc", "abc", "def", "def", "def"
), value = c(1L, NA, 2L, 5L, 1L, 4L)), class = "data.frame", row.names = c(NA,
-6L))

【讨论】:

【参考方案2】:

subsettable 一起使用

 subset(df1, ID %in% names(which(!table(ID, is.na(value))[, 2])))

【讨论】:

【参考方案3】:

使用ave末尾注释中可重复显示的DF创建一个向量,该向量对于属于ID组的每个元素都是TRUE,其中任何元素都是NA,然后我们subset对所有但是那些。

subset(DF, !ave(value, ID, FUN = anyNA))

给予:

   ID value
4 def     5
5 def     1
6 def     4

使用de Morgan's law 可以等效地表示为:

subset(DF, ave(!is.na(value), ID, FUN = all))

注意

Lines <- "ID   value
abc    1
abc    NA
abc    2
def    5
def    1 
def    4"
DF <- read.table(text = Lines, header = TRUE)

【讨论】:

【参考方案4】:

您可以使用具有NAID 的否定!%in% 如果一行包含NA,则删除所有具有该ID 的行

x[!x$ID %in% unique(x$ID[is.na(x$value)]),]
#   ID value
#4 def     5
#5 def     1
#6 def     4

【讨论】:

以上是关于如果满足一行的条件,则删除多行的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如果条件不满足,则继续执行 segue

如果不逐行遍历数据框,这需要很长时间,我如何检查多行是不是都满足条件?

如何使用熊猫将多行组合成具有多条件的行[关闭]

如果一行匹配条件,则 sed 替换与模式范围匹配的行

Python如何读取csv文件某一列的每一行数据,并判断该数值是不是满足条件?

将两条SQL语句合二为一,满足一定条件时更新表中的一行