3
votes

Passer une chaîne comme argument dans R

De façon assez régulière, je veux passer des chaînes qui fonctionnent comme des arguments dans le code. Pour le contexte, je veux souvent une section où je peux transmettre des critères de filtrage ou des hypothèses qui traversent ensuite mon analyse, mes graphiques, etc. pour le rendre plus interactif.

Un exemple simple est ci-dessous. J'ai vu la solution eval / parse, mais il semble que cela rend les morceaux de code illisibles. Existe-t-il un moyen meilleur / plus propre / plus court de le faire?

column.names <- c("group1", "group2") #two column names I want to be able to toggle between for grouping
select.column <- group.options[1] #Select the column for grouping

DataTable.summary <- 
  DataTable %>% 
  group_by(select.column) %>% #How do I pass that selection in here? 
  summarize(avg.price = mean(SALES.PRICE))


5 commentaires

Tout d'abord, vous devez rendre ceci reproductible: Erreur dans eval (lhs, parent, parent): objet 'city.filtered' introuvable . On ne sait pas non plus ce que vous entendez par "groupe1" étant une sorte de sélection. En général, un critère de sélection sera un résultat logique.


Ce n'est pas si simple de créer une fonction avec dplyr. Vous devez lire à propos de ces choses: tidyeval, rlang, !! opérateur, enquo ... Mais c'est une bonne question. Essayez de mettre à jour vos balises avec certaines des choses que j'ai écrites.


Ce lien explique tout le lien . Accédez à la section avec Citations pour voir un exemple.


Cette question peut également être utile: stackoverflow.com/questions/50011988/...


Cela peut également être utile stackoverflow.com/a/49470372/786542


3 Réponses :


4
votes

Eh bien, ceci est juste un copier-coller du site Web tidyverse: link: ( https://dplyr.tidyverse.org/articles/programming.html#programming-recipes ).

my_summarise <- function(df, group_var) {
  group_var <- enquo(group_var)
  print(group_var)
  df %>%
    group_by(!! group_var) %>%
    summarise(a = mean(a))
}
my_summarise(df, g1)
#> <quosure>
#> expr: ^g1
#> env:  global
#> # A tibble: 2 x 2
#>      g1     a
#>   <dbl> <dbl>
#> 1     1  2.5 
#> 2     2  3.33

Mais je pense que j'illustre votre problème. Je pense que ce que vous voulez vraiment faire, c'est comme le code ci-dessus, c'est-à-dire créer une fonction.


0 commentaires

4
votes

Vous pouvez utiliser la fonction group_by_ pour l'exemple de votre question:

x %>% group_by(!!!syms(select.colums)) %>% summarize(avg = mean(value))

Les fonctions de la famille * _ dans dplyr peuvent également offrent une solution plus générale que vous recherchez, bien que la documentation de dplyr indique qu'elles sont obsolètes (? group_by_ ) et pourraient disparaître à un moment donné. Une expression analogue à la solution ci-dessus utilisant la syntaxe d'évaluation tidy semble être:

x %>% group_by(!!sym(select.colums[2])) %>% summarize(avg = mean(value))

Et pour plusieurs colonnes:

library(dplyr)

x <- data.frame(group1 = letters[1:4], group2 = LETTERS[1:4], value = 1:4)
select.colums <- c("group1", "group2")

x %>% group_by_(select.colums[2]) %>% summarize(avg = mean(value))
# A tibble: 4 x 2
#  group2   avg
#  <fct>  <dbl>
# 1 A          1
# 2 B          2
# 3 C          3
# 4 D          4

Cela crée un symbole à partir d'une chaîne qui est évalué par dplyr.


0 commentaires

2
votes

Je recommande d'utiliser group_by_at () . Il prend en charge les chaînes simples ou les vecteurs de caractères:

nms <- c("cyl", "am")

mtcars %>% group_by_at(nms)


0 commentaires