如果满足一行的条件,则删除多行
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
【问题讨论】:
使用dplyr
:df %>% 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】:将subset
与table
一起使用
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】:您可以使用具有NA
的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
【讨论】:
以上是关于如果满足一行的条件,则删除多行的主要内容,如果未能解决你的问题,请参考以下文章
如果不逐行遍历数据框,这需要很长时间,我如何检查多行是不是都满足条件?