R语言 如何用data.table过滤掉特定列都为NA的行?

hmae6n7t  于 2023-05-26  发布在  其他
关注(0)|答案(4)|浏览(255)

我有同样的问题,如解决here,但我必须使用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)

创建于2023-05-25带有reprex v2.0.2
我只想过滤掉第2行。你的解决方案是什么?

kxxlusnw

kxxlusnw1#

如果“相关性”的确定是明确的,我们可以使用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
epggiuax

epggiuax2#

您可以按以下方式解决问题:

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
klr1opcd

klr1opcd3#

我们可以这样做:

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
xytpbqjk

xytpbqjk4#

使用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

相关问题