在dplyr中,如何过滤字符向量中的列以去除NA值?

qni6mghb  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(141)

我想删除列名向量中任何一列中包含NA的行。
下面是一个只有几列的简化示例。

data <- structure(list(sample_id = c("2023.01.12_2", "2023.01.12_27", 
"2023.01.12_27", "2023.01.12_3", "2023.01.12_27", "2023.01.12_27", 
"2023.01.12_4", "2023.01.12_27", "2023.01.12_27", "2023.01.12_5"
), group = c("Unedited", "Rob", "Rob", "Partial_promoter", "Rob", 
"Rob", "Promoter_and_ATG", "Rob", "Rob", "ATG"), day = c(6, NA, 
NA, 6, NA, NA, 6, NA, NA, 6), x = c(114.243333333333, 115.036666666667, 
115.073333333333, 114.41, 116.11, 116.163333333333, 113.426666666667, 
116.15, 117.253333333333, 113.46)), row.names = c(NA, -10L), class = "data.frame")

cols <- c("group", "day")

我试过几种方法,但都不管用。下面这一种似乎管用。

data %>%
filter(across(.cols = cols, .fns = ~ !is.na(.x)))

但是当我试着反转它,选择NA的列(为了质量控制的目的,我想保留它们,但只是分开),我什么也得不到:

data %>%
  filter(across(.cols = cols, .fns = ~ is.na(.x)))

有什么想法吗?

zd287kbt

zd287kbt1#

groupday满足is.na条件时,您可能需要使用if_any进行过滤

data %>%
   filter(if_any(.cols = cols, .fns = ~is.na(.x)))
      sample_id group day        x
1 2023.01.12_27   Rob  NA 115.0367
2 2023.01.12_27   Rob  NA 115.0733
3 2023.01.12_27   Rob  NA 116.1100
4 2023.01.12_27   Rob  NA 116.1633
5 2023.01.12_27   Rob  NA 116.1500
6 2023.01.12_27   Rob  NA 117.2533

还有一个if_all帮助器来检查是否所有cols都满足na的条件:

data %>%
       filter(if_any(.cols = cols, .fns = ~is.na(.x)))

这将返回无结果,因为只有day满足条件。
由于出现了关于在filter中使用across的警告,您可以通过以下方式替换第一个过滤器:

data %>%
  filter(if_all(.cols = cols, .fns = ~ !is.na(.x)))
gtlvzcf8

gtlvzcf82#

您可以根据您提到的列使用drop_naany_of

cols <- c("group", "day")
library(tidyr)
data |>
  drop_na(any_of(cols))
#>      sample_id            group day        x
#> 1 2023.01.12_2         Unedited   6 114.2433
#> 2 2023.01.12_3 Partial_promoter   6 114.4100
#> 3 2023.01.12_4 Promoter_and_ATG   6 113.4267
#> 4 2023.01.12_5              ATG   6 113.4600

创建于2023年1月16日,使用reprex v2.0.2

相关问题