Это очень сложно, потому что пример показывает, что вы хотите отфильтровать данные из всех столбцов, когда любой из них удовлетворяет условию (т.е. вы хотите, чтобы объединение ). Это делается с помощью filter_all()
и any_vars()
.
В то время как filter(across(everything(), ...))
отфильтровывает все столбцы, когда все из них соответствуют условию (т. Е. Это пересечение , что совершенно противоположно предыдущему).
Чтобы преобразовать его из пересечения в объединение (т.е. чтобы снова получить строки, где любые столбцов соответствуют условию), вам, вероятно, нужно проверить сумму строки для этого:
diamonds %>%
filter(rowSums(across(everything(), ~grepl("V", .x))) > 0)
Он суммирует все TRUE
, которые появляются в строке, т.е. если есть хотя бы одно значение, удовлетворяющее условию, эта сумма строки будет > 0
и будет отображаться.
Извините, что across()
не самый первый дочерний элемент filter()
, но он хоть какое-то представление, как это сделать. : -)
Оценка:
Используя метод @ TimTeaFan, чтобы проверить, что:
identical(
{diamonds %>%
filter_all(any_vars(grepl('V',.)))
},
{diamonds %>%
filter(rowSums(across(everything(), ~grepl("V", .x))) > 0)
}
)
#> [1] TRUE
Тест:
Согласно наше обсуждение в ответе TimTeaFan, вот сравнение, на удивление, все решения имеют одинаковое время:
library(tidyverse)
microbenchmark::microbenchmark(
filter_all = {diamonds %>%
filter_all(any_vars(grepl('V',.)))},
purrr_reduce = {diamonds %>%
filter(across(everything(), ~ grepl('V', .)) %>% purrr::reduce(`|`))},
base_reduce = {diamonds %>%
filter(across(everything(), ~ grepl('V', .)) %>% Reduce(`|`, .))},
rowsums = {diamonds %>%
filter(rowSums(across(everything(), ~grepl("V", .x))) > 0)},
times = 100L,
check = "identical"
)
#> Unit: milliseconds
#> expr min lq mean median uq max neval
#> filter_all 295.7235 302.1311 309.6455 305.0491 310.0335 449.3619 100
#> purrr_reduce 297.8220 302.4411 310.2829 306.2929 312.2278 461.0194 100
#> base_reduce 298.5033 303.6170 309.4147 306.1839 312.3518 409.5273 100
#> rowsums 295.3863 301.0281 307.8517 305.3142 309.4793 372.8867 100
Создано 14.07.2020 пакетом реплекс ( v0.3.0)