2017-09-13 1 views
0

Je souhaite utiliser le nom d'une colonne dans une fonction, sans la donner explicitement comme argument à cette fonction, appelée dans un rangé (dplyr, , purrr, ...). C'est parce que je voudrais utiliser cette fonction sur de nombreuses colonnes (par exemple avec mutate_all et map), et non mutate chaque colonne séparément.Obtention du nom d'une colonne en tant qu'argument supplémentaire pour fonctionner dans un tube mutate_all tidy

Exemple:

Disons que je voudrais chaque valeur dans chaque colonne à préfixé par ce nom de colonne et un trait de soulignement. Les travaux suivants:

library(dplyr) 
library(purrr) 
library(stringr) 

tib <- tibble(a = 1:3, b = 4:6, c = 7:9) 

f <- function(value, column_name) { 
    str_c(column_name, "_", value) 
} 

tib %>% 
    mutate(a = map_chr(a, f, "a"), 
     b = map_chr(b, f, "b"), 
     c = map_chr(c, f, "c")) 

# A tibble: 3 x 3 
    a  b  c 
<chr> <chr> <chr> 
1 a_1 b_4 c_7 
2 a_2 b_5 c_8 
3 a_3 b_6 c_9 

Mais que faire si j'ai >> 3 colonnes?

Il serait agréable d'avoir une fonction qui trouve le nom de la colonne par lui-même, je peux utiliser mutate_all:

f2 <- function(value) { 
    column_name <- miraculously_get_column_name() 
    str_c(column_name, "_", value) 
} 

tib %>% 
    mutate_all(f2) 

Mais ce n'est pas qui va se passer. Un souhait sans doute plus réaliste est d'entrer comme un argument supplémentaire pour mutate_all une expression qui trouve le nom de colonne à chaque colonne et utiliser la f originale, quelque chose comme:

tib %>% 
    mutate_all(f, get_column_name_somehow()) 

Alors, comment dois-je faire cela avec un tuyau (et s'il y a un autre moyen et aucun moyen de le faire avec un tuyau bien rangé, alors allons-y).

Répondre

3

Vous pouvez le faire de cette façon:

tib %>% map2_df(names(.),f) 

Ou comme @aosmith mentions dans les commentaires que vous pouvez utiliser imap_dfc qui est la réponse précise à votre question:

tib %>% imap_dfc(f) 
+0

C'est incroyable, mon seul question est que je ne comprends pas. Mais c'est sur moi, merci. 'map2_dfr'? Qu'est-ce qui s'est passé à 'map2_df'? –

+0

oui 'map_df' fonctionne aussi, c'est dans l'index du paquet mais pas dans le document,' map_df', 'map_dfr' et' map_dfc' donnent le même résultat ici –

+0

Le point dans 'noms (.)' Appelle l'entrée principale , 'tib' dans ce cas –