2017-09-18 7 views
0

Je voudrais muter des colonnes d'une trame de données en utilisant un argument gsub sur les colonnes spécifiées dans une variable, mais je suis aux prises avec une évaluation non standard.dplyr NSE - comment passer les noms de colonne pour muter l'appel de fonction?

Dans cet exemple de jouet, je voudrais utiliser columns[[1]] et columns[[2]] au lieu de .$name_A et .$name_B dans mon appel à gsub. Puis-je, ou dois-je repenser mon approche?

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

Vous pouvez utiliser 'rlang :: sym'. Voir un exemple [ici] (https://stackoverflow.com/a/45465630/2461552) – aosmith

Répondre

1

Vous êtes sur la hauteur. Vous pouvez utiliser rlang::syms avec !! pour faire ce dont vous avez besoin.

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

Je ne suis pas 100% sûr de ce que vous demandez, mais vous pouvez utiliser regex pour appliquer mutent aux colonnes en utilisant mutate_at et matches:

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)) 

Hope qui aide!

EDIT - vous pouvez également appeler par index:

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))