【发布时间】:2021-06-05 17:39:56
【问题描述】:
要解决的问题
我需要两个函数来根据可能包含缺失值的列指示符(即逻辑)在小标题上实现和/或过滤。函数的参数应该是要考虑的列的字符向量。
我的解决方案
filter_checked <- function(db, vars = NULL) {
db %>%
dplyr::filter(
dplyr::if_all(dplyr::all_of(vars), ~ !is.na(.x) & .x)
)
}
filter_or_checked <- function(db, vars = NULL) {
db %>%
dplyr::filter(
dplyr::if_any(dplyr::all_of(vars), ~ !is.na(.x) & .x)
)
}
要通过的示例测试
test_that("filter checks", {
foo <- tibble::tibble(
id = 1:5,
a = c(TRUE, TRUE, FALSE, FALSE, FALSE),
b = c(NA, TRUE, NA, TRUE, NA)
)
expect_equal(filter_checked(foo)[["id"]], 1:5)
expect_equal(filter_checked(foo, "a")[["id"]], 1:2)
expect_equal(filter_checked(foo, "b")[["id"]], c(2, 4))
expect_equal(filter_checked(foo, c("a", "b"))[["id"]], 2)
})
test_that("filter_or_checks", {
foo <- tibble::tibble(
id = 1:5,
a = c(TRUE, TRUE, FALSE, FALSE, FALSE),
b = c(NA, TRUE, NA, TRUE, NA)
)
expect_equal(filter_or_checked(foo)[["id"]], integer(0))
expect_equal(filter_or_checked(foo, "a")[["id"]], 1:2)
expect_equal(filter_or_checked(foo, "b")[["id"]], c(2, 4))
expect_equal(filter_or_checked(foo, c("a", "b"))[["id"]], c(1, 2, 4))
})
我的问题
在我看来,我的功能太复杂了。无论如何,我认为这是我缺乏知识。那么,有没有更好(即更容易阅读/理解/教授)的 tidyverse 解决方案来解决这个问题?
【问题讨论】: