gpt4 book ai didi

r - 具有多列条件的dplyr过滤器

转载 作者:行者123 更新时间:2023-12-03 22:56:27 25 4
gpt4 key购买 nike

这是一个虚拟数据:

father<- c(1, 1, 1, 1, 1)
mother<- c(1, 1, 1, NA, NA)
children <- c(NA, NA, 2, 5, 2)
cousins <- c(NA, 5, 1, 1, 4)


dataset <- data.frame(father, mother, children, cousins)
dataset


father mother children cousins
1 1 NA NA
1 1 NA 5
1 1 2 1
1 NA 5 1
1 NA 2 4

我想过滤这一行:
  father  mother  children cousins
1 1 NA NA

我可以做到:
test <- dataset %>% 
filter(father==1 & mother==1) %>%
filter (is.na(children)) %>%
filter (is.na(cousins))
test

我的问题 :
我有很多专栏,比如爷爷、叔叔1、叔叔2、叔叔3,我想避免这样的事情:
  filter (is.na(children)) %>%
filter (is.na(cousins)) %>%
filter (is.na(uncle1)) %>%
filter (is.na(uncle2)) %>%
filter (is.na(uncle3))
and so on...

我如何使用 dplyr 说用 na 过滤所有列(父亲==1 & 母亲==1 除外)

最佳答案

一个可能的 dplyr (0.5.0.9004 <= version < 1.0) 解决方案是:

# > packageVersion('dplyr')
# [1] ‘0.5.0.9004’

dataset %>%
filter(!is.na(father), !is.na(mother)) %>%
filter_at(vars(-father, -mother), all_vars(is.na(.)))
解释:
  • vars(-father, -mother) : 选择除 father 之外的所有列和 mother .
  • all_vars(is.na(.)) : 保留行 is.naTRUE全部 选定的列。

  • 注: any_vars应该用来代替 all_vars如果行在哪里 is.naTRUE任何 列要保留。

    更新 (2020-11-28)
    _at函数和 vars已被 across 的使用所取代从 dplyr 1.0 开始,现在推荐以下方式(或类似方式):
    dataset %>%
    filter(across(c(father, mother), ~ !is.na(.x))) %>%
    filter(across(c(-father, -mother), is.na))
    查看 across 的更多示例以及如何使用这里的新方法重写以前的代码: Colomn-wise operatons或输入 vignette("colwise")在 R 安装最新版本的 dplyr 后.

    关于r - 具有多列条件的dplyr过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43938863/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com