【问题标题】:Removing specific rows with some NA values in a data frame删除数据框中具有某些 NA 值的特定行
【发布时间】:2015-10-19 13:42:06
【问题描述】:

仅当找到 NA 值的其他行与数据框中的其他值匹配时,我想从数据框中删除列具有 NA 的行

例如,

df <- data.frame(ID = c(1,1,2,2),DAY=c(1,1,2,3), VAL=c(1,NA,NA,5))

我想删除第二行,因为 VAL 中缺少一个值,并且已经有一个 ID = 1 和 DAY = 1 的 VAL 值来获取

ID      DAY     VAL
1        1        1
2        2        NA
2        3        5

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

【问题讨论】:

  • @MichaelChirico 我没有发现它是重复的,因为na.omit 更通用,它省略了所有具有NA 值的行。但是,这里 OP 希望按组有选择地删除 NA 值。

标签: r dataframe


【解决方案1】:

这可以通过在每个分组变量中创建一个逻辑条件来完成。在这里,我猜测 'ID' 和 'DAY' 作为分组变量。

一个选项是使用data.table。我们将“data.frame”转换为“data.table”(setDT(df))。按“ID”、“DAY”分组,我们得到满足条件(sum(is.na(VAL))!= .N &amp; is.na(VAL))的“VAL”的行索引(.I),并从数据集“df”中删除该行索引。 sum(is.na(VAL))!= .N 提供了一个逻辑向量,用于检查组中 NA 值的数量是否不等于该组中的行数 (.N)。如果“VAL”与之前的条件一样也是“NA”,则将其删除。

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'、DAY'分组,然后在上面提到的条件下使用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

【讨论】:

  • 也许我阅读的不够仔细,但是为什么这两种解决方案会返回不同的结果?
  • @mplanco 因为dplyr代码中有一个小错误。它应该是:df %&gt;% group_by(ID, DAY) %&gt;% filter(!(sum(is.na(VAL))!=n() &amp; is.na(VAL)))
  • @StevenBeaupré 谢谢,我尝试了一些不同的东西并得到了不同的结果。
  • @mpalanco 感谢您的评论。我什至没有注意到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-04
  • 2022-06-13
相关资源
最近更新 更多