【问题标题】:Remove lines with only NAs from data.table从 data.table 中删除仅包含 NA 的行
【发布时间】:2016-07-22 11:31:42
【问题描述】:

我想从 data.table 中删除仅包含 NA 的行。

> tab = data.table(A = c(1, NA, 3), B = c(NA, NA, 3))
> tab
    A  B
1:  1 NA
2: NA NA
3:  3  3

通常我会用 apply(dat, 1, ...) 来做这件事,不幸的是它不适用于 data.table,但它导致我得到这个不优雅的解决方案:

> tab[apply(as.data.frame(tab), 1, function(x) !all(is.na(x))), ]
   A  B
1: 1 NA
2: 3  3

如何在不知道列名的情况下以最快的方式实现这一点?

【问题讨论】:

  • 为什么它不能在 data.table 上工作?!?

标签: r data.table


【解决方案1】:

我们可以将Reduceis.na& 一起使用

tab[!Reduce(`&`, lapply(tab, is.na))]
#   A  B
#1: 1 NA
#2: 3  3

或者一个紧凑但不那么有效的方法是

tab[rowSums(!is.na(tab)) != 0L]

此外,正如 @Frank 所评论的,一种基于联接的方法,

tab[!tab[NA_integer_], on = names(tab)]

【讨论】:

  • 可能效率极低,但也有df[!df[NA_integer_], on=names(df)] -- 针对一行 NA 对所有列进行反连接。
  • 有没有办法让这段代码排除第一列?我有一个 data.table,我想删除除第一列之外完全为空的行。
  • @Tom 你能发个新问题吗
【解决方案2】:

另一个想法:

library(dplyr)
df %>% 
  filter(rowSums(is.na(.)) < length(.))

【讨论】:

    【解决方案3】:

    很喜欢

    tab <- tab[sapply(1:nrow(tab), function(i){!all(is.na(tab[i,]))}),]
    

    这对我来说很直观,但我不确定这是最快的方法。

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 2015-05-06
      • 2012-10-12
      • 2013-08-09
      • 1970-01-01
      相关资源
      最近更新 更多