2017-09-18 57 views
0

我想在变量中指定的列上使用gsub参数对数据框的列进行变异,但我正在努力处理非标准的评估。dplyr NSE - 如何传递列名来改变函数调用?

在这个玩具的例子中,我想在我的gsub调用中使用columns[[1]]columns[[2]]而不是.$name_A.$name_B。我可以,还是需要重新考虑我的方法?

library(tidyverse) 

test_df <- tibble(name_A = 
        c("asdf", "ghjk"), 
       name_B = 
        c("qwer", "tyui")) 

columns <- c("name_A", "name_B") 

test_df %>% 
    mutate(new_col_A = 
      gsub(pattern = 'asdf', replacement = 'NEW_VALUE_A', x = .$name_A), 
     new_col_B = 
      gsub(pattern = 'tyui', replacement = 'NEW_VALUE_B', x = .$name_B)) 
+0

你可以用'rlang :: sym'。看一个例子[这里](https://stackoverflow.com/a/45465630/2461552) – aosmith

回答

1

你快到了。您可以使用rlang::syms以及!!来执行您所需的操作。

library(tidyverse) 

test_df <- tibble(name_A = 
        c("asdf", "ghjk"), 
        name_B = 
        c("qwer", "tyui")) 

columns <- rlang::syms(c("name_A", "name_B")) 

test_df %>% 
    mutate(new_col_A = 
      gsub(pattern = 'asdf', replacement = 'NEW_VALUE_A', x = !! columns[[1]]), 
     new_col_B = 
      gsub(pattern = 'tyui', replacement = 'NEW_VALUE_B', x = !! columns[[2]])) 
0

我不是100%肯定你问什么,而是你可以使用正则表达式来申请变异成使用mutate_atmatches列:

library(tidyverse) 

test_df %>% 
    mutate_at(vars(matches('A')), 
      function(.x) gsub(pattern = 'asdf', 
           replacement = 'NEW_VALUE_A', .x)) %>% 
    mutate_at(vars(matches('B')), 
      function(.x) gsub(pattern = 'tyui', 
         replacement = 'NEW_VALUE_B', .x)) 

希望帮助!

编辑 - 您还可以通过指数拨打:

test_df %>% 
mutate_at(vars(1), 
      function(.x) gsub(pattern = 'asdf', 
          replacement = 'NEW_VALUE_A', .x)) %>% 
mutate_at(vars(2), 
      function(.x) gsub(pattern = 'tyui', 
          replacement = 'NEW_VALUE_B', .x)) 
相关问题