基于具有相似命名结构的多个列进行过滤

时间:2018-04-30 11:55:46

标签: r dplyr nse

我想tibble我的x在几个名称相似的列上。具体而言,我希望将x_newyy_newfilter_at进行比较等等,但不指定显式名称,而是使用列名称中的结构。

我尝试使用my_df %>% filter_at(vars(contains("_new")), any_vars(funs({ x <- . x_name <- quo_name(quo(x)) x_new_name <- str_replace(x_name, "_new", "") paste(x_name, "!=", x_new_name) }) )) ,但这不起作用,因为我不知道如何正确评估最后一行中的公式。

my_df <- tibble(x = 1:5, 
                x_new = c(1:4, 1), 
                y = letters[1:5], 
                y_new = c(letters[1:3], "a", "e"))

# A tibble: 5 x 4
#       x x_new y     y_new
#   <int> <dbl> <chr> <chr>
# 1     1    1. a     a    
# 2     2    2. b     b    
# 3     3    3. c     c    
# 4     4    4. d     a    
# 5     5    1. e     e   

数据

# A tibble: 2 x 4
#       x x_new y     y_new
#   <int> <dbl> <chr> <chr>
# 1     4    4. d     a    
# 2     5    1. e     e 

预期输出

wget

1 个答案:

答案 0 :(得分:2)

我们可以使用map执行此操作。通过删除列名称的后缀部分('nm1')创建unique名称的向量。循环遍历'nm1',通过检查行是否相等,选择matches列名称reduce到单个逻辑向量的列,然后reduce {{1}逻辑向量到单个逻辑向量,list基于那个

的行
extract

另一种选择是创建表达式然后评估

library(tidyverse)
nm1 <- unique(sub("_.*", "", names(my_df)))
map(nm1, ~ my_df %>% 
                select_at(vars(matches(.x))) %>% 
                reduce(`!=`)) %>% 
       reduce(`|`) %>% 
       magrittr::extract(my_df, ., )
#    x x_new y     y_new
#  <int> <dbl> <chr> <chr>
#1     4     4 d     a    
#2     5     1 e     e