2017-06-27 2 views
2

J'essaye de construire une fonction qui me permettra d'exécuter des fonctions sur des colonnes commençant par un préfixe spécifique. J'ai du mal à comprendre comment obtenir les noms à évaluer à la bonne chose.Dplyr Tidyyeval pour les noms de variable construits

J'ai regardé le site Web dplyr où il est question de programming mais je n'arrivais pas à trouver comment l'évaluer correctement.

Je me sers de la version la plus récente de dplyr sur CRAN (v0.70) où @hadley a introduit tidyeval

Reprex

library(tidyverse) 

tbl1 <- tibble(
    urn = c(1 ,2 ,3), 
    a_width = c(10,20,30), 
    a_height = c(12,13,14), 
    b_width = c(25,50,75), 
    b_height = c(25,50,75) 
) 

my_mean <- function(x, group) { 
    width <- paste0(quo_name(group), "_width") 
    height <- paste0(quo_name(group), "_height") 

    summarise(x, 
    !!paste0(group, "_mean_width") := mean(!!width),   
    !!paste0(group, "_mean_height") := mean(!!height)   
) 
} 

my_mean(tbl1, "a") 

# # A tibble: 1 x 2 
# a_mean_width a_mean_height 
# <dbl>   <dbl> 
# 1   NA   NA 
# Warning messages: 
# 1: In mean.default("a_width") : 
# argument is not numeric or logical: returning NA 
# 2: In mean.default("a_height") : 
# argument is not numeric or logical: returning NA 
+1

Je pense que vous avez manqué une virgule dans la commande 'summarise'. – amarchin

+0

Vous avez raison, la virgule a été manquée mais c'est plus un cas de ma mauvaise frappe, plutôt que la cause du problème. – Dan

+0

Bien sûr, j'essayais juste de reproduire votre erreur et la virgule ratée rendait cela impossible :) – amarchin

Répondre

0

!!width retourne la chaîne "a_width". Vous devez faire !!sym(width) pour le transformer en un nom. De même pour !!height.

+3

Je pense que vous avez besoin de '!! sym (largeur)' pas 'sym (!! largeur)' – aosmith

+1

Je reçois une erreur disant 'pourrait pas trouver la fonction sym ' – Dan

+0

'sym' est une fonction du paquet rlang qui est ce que dplyr utilise pour ce truc –