使用&逻辑对列范围进行范围过滤

时间:2019-02-01 13:18:01

标签: r dplyr tidyverse

我试图找到滤波过的数据帧至过滤柱的特定范围以包含该范围的列内的字符向量某处的所有元素的行的方法。

例如,如果我的列范围是以下范围:

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

谢谢!

2 个答案:

答案 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来说很慢,但这是特定于您的应用程序的。