我想删除列中有NA的行,只有当找到NA值的其他行与数据框中的其他值匹配时
例如,
df <- data.frame(ID = c(1,1,2,2),DAY=c(1,1,2,3), VAL=c(1,NA,NA,5))
我想删除第二行,因为VAL中有一个缺失的值,并且VAL已经有一个ID值为1且DAY = 1的值
ID DAY VAL
1 1 1
2 2 NA
2 3 5
知道怎么做吗?我可以尝试编写一个循环,但这似乎并不高效。
答案 0 :(得分:4)
这可以通过在每个分组变量中创建逻辑条件来完成。在这里,我在猜测&#39; ID&#39;和&#39; DAY&#39;作为分组变量。
一种选择是使用data.table
。我们转换了&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df)
)。按照ID&#39;,&#39; DAY&#39;,我们得到&#39; VAL&#39;的行索引(.I
)。满足条件(sum(is.na(VAL))!= .N & is.na(VAL)
)并从数据集中删除该行索引&#39; df&#39;。 sum(is.na(VAL))!= .N
给出一个逻辑向量,用于检查组中NA
值的数量是否不等于该组中的行数(.N
)。如果&#39; VAL&#39;也是一个&#39; NA&#39;与之前的条件一起,然后将其删除。
library(data.table)
i1 <- setDT(df)[, .I[sum(is.na(VAL))!=.N & is.na(VAL)] , by = .(ID, DAY)]$V1
df[-i1]
# ID DAY VAL
#1: 1 1 1
#2: 2 2 NA
#3: 2 3 5
或dplyr
的类似选项。我们按照ID&#39;,DAY&#39;分组,然后在上述条件下使用filter
。
library(dplyr)
df %>%
group_by(ID, DAY) %>%
filter(!(sum(is.na(VAL))!=n() & is.na(VAL)))
# ID DAY VAL
#1 1 1 1
#2 2 2 NA
#3 2 3 5