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

时间:2021-03-08 14:40:38

标签: r na delete-row

我有以下数据集:

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

预先感谢您的任何帮助。

干杯

4 个答案:

答案 0 :(得分:3)

您可以使用带有 ! ID 的否定 %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

答案 1 :(得分:1)

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

subset

给予:

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

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

   ID value
4 def     5
5 def     1
6 def     4

注意

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

答案 2 :(得分:1)

subsettable 一起使用

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

答案 3 :(得分:0)

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