在数据框中删除带有某些NA值的特定行。

16 浏览
0 Comments

在数据框中删除带有某些NA值的特定行。

我想要从数据框中删除包含NA的行,但前提是在找到NA值的其他行中,VAL列的值与数据框中的其他值相匹配。

例如,

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
0 Comments

问题:如何从一个数据框中删除某些具有NA值的行?

解决方法之一是使用data.table包。我们将数据框转换为data.table(setDT(df)),然后根据'ID'和'DAY'进行分组。通过找到满足条件(sum(is.na(VAL))!= .N & is.na(VAL))的'VAL'的行索引(.I),并将该行索引从数据集'df'中删除。sum(is.na(VAL))!= .N 返回一个逻辑向量,检查组中NA值的数量是否不等于该组的行数(.N)。如果'VAL'与前述条件一起是NA,那么该行也将被删除。

另一种类似的方法是使用dplyr包。我们根据'ID'和'DAY'进行分组,然后使用filter函数与上述条件一起使用。

这两种方法为什么会返回不同的结果?

因为在dplyr代码中存在一个小错误。正确的代码应该是:df %>% group_by(ID, DAY) %>% filter(!(sum(is.na(VAL))!=n() & is.na(VAL)))

感谢你的评论,我没有注意到这个错误。

0