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

jak*_*b-r 2 r data.table

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

> 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
Run Code Online (Sandbox Code Playgroud)

通常我会这样做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
Run Code Online (Sandbox Code Playgroud)

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

akr*_*run 6

我们可以使用Reduceis.na&

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

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

tab[rowSums(!is.na(tab)) != 0L]
Run Code Online (Sandbox Code Playgroud)

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

tab[!tab[NA_integer_], on = names(tab)]
Run Code Online (Sandbox Code Playgroud)

  • 可能效率极低,但还有`df[!df[NA_integer_], on=names(df)]`——针对一行 NA 对所有列进行反连接。 (2认同)