删除数据框中具有一些NA值的特定行

时间:2015-07-28 19:52:12

标签: r dataframe

我想删除列中有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

知道怎么做吗?我可以尝试编写一个循环,但这似乎并不高效。

1 个答案:

答案 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