2017-04-21 1 views
4

J'ai un bloc de données appelé "Quelque chose". Je suis en train de faire une agrégation sur l'une des colonnes numériques à l'aide de summary, et je veux que le nom de cette colonne contienne "Something" - titre du cadre de données dans le nom de la colonne.Renommer un nom de colonne, en utilisant le titre/nom du bloc de données

Exemple:

temp <- Something %>% 
    group_by(Month) %>% 
    summarise(avg_score=mean(score)) 

Mais je voudrais nommer la colonne agrégée comme "avg_Something_score". Cela avait-il du sens?

+0

qu'en est-il de 'dplyr :: rename()'? – Nate

Répondre

2

Il semble il est plus logique de générer dynamiquement le nouveau nom de colonne afin de ne pas avoir à coder en dur le nom de la trame de données à l'intérieur de . Peut-être quelque chose comme la fonction ci-dessous, qui prend une trame de données, une variable de regroupement, et une variable numérique:

library(dplyr) 
library(lazyeval) 

my_fnc = function(data, group, value) { 

    df.name = deparse(substitute(data)) 

    data %>% 
    group_by_(group) %>% 
    summarise_(avg = interp(~mean(v), v=as.name(value))) %>% 
    rename_(.dots = setNames("avg", paste0("avg_", df.name, "_", value))) 
} 

Maintenant, nous allons lancer la fonction sur deux trames de données différentes:

my_fnc(mtcars, "cyl", "mpg") 
cyl avg_mtcars_mpg 
    <dbl>   <dbl> 
1  4  26.66364 
2  6  19.74286 
3  8  15.10000 
my_fnc(iris, "Species", "Petal.Width") 
 Species avg_iris_Petal.Width 
1  setosa    0.246 
2 versicolor    1.326 
3 virginica    2.026 
+0

Bonne réponse. Je pense que c'est une bonne idée d'utiliser l'évaluation standard pour toutes les fonctions 'dplyr' dans ce cas. – www

+0

Grande réponse @ eipi10. cela pourrait être trop naïf, mais je ne sais pas pourquoi les fonctions se terminent par des traits de soulignement? Serait-ce trop demander une explication sur summary_, et rename_ dans le code de réponse? –

+0

'dplyr' utilise [évaluation non standard] (https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html). 'summarise_', et d'autres fonctions avec' _', sont à la fin les contreparties d'évaluation standard des fonctions régulières 'dplyr'. Vous devez utiliser ces versions d'évaluation standard lorsque vous souhaitez transmettre des noms de variables "standard" dans dplyr dans le cadre d'un appel de fonction ou modifier dynamiquement des noms.Je pense que la réponse de @ akrun utilise la même idée, mais avec une nouvelle approche de l'évaluation standard/non standard qui sera publiée dans la prochaine version de dplyr/tidyverse. – eipi10

3

Vous pouvez utiliser rename_ de dplyr avec deparse(substitute(Something)) comme ceci:

Something %>% 
group_by(Month) %>% 
summarise(avg_score=mean(score))%>% 
rename_(.dots = setNames("avg_score", 
paste0("avg_",deparse(substitute(Something)),"_score"))) 
0

Vous pouvez utiliser colnames (quelque chose) < -c ("score", "something_avg_score")

2
library(dplyr) 

# Take mtcars as an example 
# Calculate the mean of mpg using cyl as group 
data(mtcars) 
Something <- mtcars 

# Create a list of expression 
dots <- list(~mean(mpg)) 

# Apply the function, Use setNames to name the column 
temp <- Something %>% 
    group_by(cyl) %>% 
    summarise_(.dots = setNames(dots, 
           paste0("avg_", as.character(quote(Something)), "_score"))) 
+0

Vous les parenthèses fermant 'as.character' est au mauvais endroit mais sinon génial +1 – MorganBall

+0

@MorganBall Merci d'avoir signalé l'erreur. J'ai fixé la position de la clôture. – www

3

Nous pouvons utiliser la version de développement de dplyr (bientôt publié 0.6.0) qui fait cela avec quosure s

library(dplyr) 
myFun <- function(data, group, value){ 
     dataN <- quo_name(enquo(data)) 
     group <- enquo(group) 
     value <- enquo(value) 

     newName <- paste0("avg_", dataN, "_", quo_name(value)) 
    data %>% 
     group_by(!!group) %>% 
     summarise(!!newName := mean(!!value)) 
} 

myFun(mtcars, cyl, mpg) 
# A tibble: 3 × 2 
# cyl avg_mtcars_mpg 
# <dbl>   <dbl> 
#1  4  26.66364 
#2  6  19.74286 
#3  8  15.10000 

myFun(iris, Species, Petal.Width) 
# A tibble: 3 × 2 
#  Species avg_iris_Petal.Width 
#  <fctr>    <dbl> 
#1  setosa    0.246 
#2 versicolor    1.326 
#3 virginica    2.026 

Ici, le enquo prend les arguments d'entrée comme substitute de base R et convertit à quosure, avec quo_name, nous pouvons le convertir en chaîne, évaluer le quosure en unquoting (!! ou UQ) à l'intérieur group_by/summarise/mutate etc. Les noms de colonne sur les lhs d'affectation (:=) peuvent également évalués par ne pas appeler pour obtenir les colonnes d'intérêt