我试图找到滤波过的数据帧至过滤柱的特定范围以包含该范围的列内的字符向量某处的所有元素的行的方法。
例如,如果我的列范围是以下范围:
library(dplyr)
set.seed(10)
df <- tibble(
a = sample(LETTERS[1:10], 10),
b = sample(LETTERS[1:10], 10),
c = sample(LETTERS[1:10], 10),
d = sample(LETTERS[1:10], 10),
e = sample(LETTERS[1:10], 10)
)
df
#> # A tibble: 10 x 5
#> a b c d e
#> <chr> <chr> <chr> <chr> <chr>
#> 1 F G I F C
#> 2 C F F A J
#> 3 D A G B A
#> 4 E E C G F
#> 5 A C H C B
#> 6 B I D D H
#> 7 G H E E E
#> 8 J D A J G
#> 9 H J B H D
#> 10 I B J I I
和我想滤波器到具有至少一个实例的行"A"
和 "C"
我可以使用filter_at
两次的至少一个实例得到理想的结果:
df %>%
filter_at(vars(a:e), any_vars(. == "A")) %>%
filter_at(vars(a:e), any_vars(. == "C"))
#> # A tibble: 2 x 5
#> a b c d e
#> <chr> <chr> <chr> <chr> <chr>
#> 1 C F F A J
#> 2 A C H C B
然而,我试图在闪亮来实现这个,其中过滤器标准来作为矢量c("A", "C")
从选择输入,所以有一种方法可以使用矢量与单个滤波器函数做呢?>
使用%in%
不会工作,因为它返回与任何行"A"
或 "C"
df %>%
filter_at(vars(a:e), any_vars(. %in% c("A", "C")))
#> # A tibble: 6 x 5
#> a b c d e
#> <chr> <chr> <chr> <chr> <chr>
#> 1 F G I F C
#> 2 C F F A J
#> 3 D A G B A
#> 4 E E C G F
#> 5 A C H C B
#> 6 J D A J G
谢谢!
答案 0 :(得分:0)
您可以在循环中进行过滤:
filter_vec <- c("A", "C")
df_filtered <- df
for (f in filter_vec) {
df_filtered <- filter_at(df_filtered,
vars(a:e),
any_vars(. == f))
}
df_filtered
#> # A tibble: 2 x 5
#> a b c d e
#> <chr> <chr> <chr> <chr> <chr>
#> 1 C F F A J
#> 2 A C H C B
答案 1 :(得分:0)
完整的tidyverse
解决方案,尽管as_data_frame
和$
的调用看起来很丑陋,而且嵌套函数也不理想,但它们都是在管道内处理而没有循环。
target = c('A', 'C')
flag = df %>%
select(a:e) %>% # If you have other columns, this does the same scoping
rowwise %>%
do(as_data_frame(all(target %in% .))) %>%
.$value
df %>% filter(flag)
#> # A tibble: 2 x 5
#> a b c d e
#> <chr> <chr> <chr> <chr> <chr>
#> 1 C F F A J
#> 2 A C H C B
由reprex package(v0.2.1)于2019-02-01创建
我很早就回忆起rowwise
调用,对于很长的data.frames来说很慢,但这是特定于您的应用程序的。