如何使用data.table筛选出特定列全部为NA的行?

4

我有一个与这里解决方案类似的问题,但我必须使用data.table。

在data.table中,最佳的过滤所有行的方式是什么,其中特定/“相关”的列全部为NA,不管其他“不相关”的列显示(NA /或不是)。

library(data.table)

df <- data.frame('epoch' = c(1,2,3),
               'irrel_2' = c(NA,4,5),
               'rel_1' = c(NA, NA, 8),
               'rel_2' = c(3,NA,7)
               )

df
#>   epoch irrel_2 rel_1 rel_2
#> 1     1      NA    NA     3
#> 2     2       4    NA    NA
#> 3     3       5     8     7

setDT(df)
wrong <- na.omit(df, cols = 3:4)

使用reprex v2.0.2于2023年5月25日创建

我只想过滤掉第二行,你有什么解决方案吗?

4个回答

4

如果“相关性”的确定很清晰,我们可以使用patterns,或者您也可以轻松地使用名称向量。从那里,我们可以使用rowSums(!is.na(.))来查找至少一个非NA值。

library(data.table)
setDT(df)
df[df[, rowSums(!is.na(.SD)) > 0, .SDcols = patterns("^rel")],]
#    epoch irrel_2 rel_1 rel_2
#    <num>   <num> <num> <num>
# 1:     1      NA    NA     3
# 2:     3       5     8     7

3
您可以按照以下方式解决问题:
df[!is.na(fcoalesce(rel_1, rel_2)),]
# or
df[!is.na(pmin(rel_1, rel_2, na.rm=TRUE)),]

   epoch irrel_2 rel_1 rel_2
   <num>   <num> <num> <num>
1:     1      NA    NA     3
2:     3       5     8     7

2
我们可以这样做:
df[!is.na(rel_1) | !is.na(rel_2)]

   epoch irrel_2 rel_1 rel_2
1:     1      NA    NA     3
2:     3       5     8     7

2
使用 dplyr
library(dplyr)
df %>% 
  filter(!if_all(starts_with("rel"), is.na))
  epoch irrel_2 rel_1 rel_2
1     1      NA    NA     3
2     3       5     8     7

或者使用 data.table

library(data.table)
setDT(df)[df[,  !Reduce(`&`, lapply(.SD, is.na)), 
  .SDcols = patterns("^rel")]]
   epoch irrel_2 rel_1 rel_2
1:     1      NA    NA     3
2:     3       5     8     7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接