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

Remove multiple rows if condition for one row is met

我有以下数据集:

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

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

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

使用末尾注释中可重复显示的 DF ave 创建一个向量,该向量对于属于 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)

subsettable

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

一个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))