2017-09-11 2 views
1

Je tente de calculer une médiane mobile sur une variable contenue dans un fichier data.frame en utilisant dplyr. Le problème que je rencontre est que la fonction que je passe dans rollapply() a le même nom qu'une variable dans le data.frame d'origine. Par exemple:Collision de noms de variables dans dplyr

df <- data.frame(median = seq(1:100)) 

df %>% 
    mutate(ln_median = log(median)) %>% 
    mutate(ln_median_10 = rollapply(ln_median, 5, median)) 

génère le message d'erreur:

Error in eval(substitute(expr), envir, enclos) : '1:100' is not a function, character or symbol

La cause sous-jacente est que la médiane dans le rollapply() est Résolus à la variable dans la data.frame et non la fonction « médiane ". Je suis en mesure de contourner ce avec le code suivant:

df %>% mutate(ln_median = log(median)) %>% 
     mutate(ln_median_10 = rollapply(ln_median, 5, function(a) median(a), fill = NA)) 

C'est, en enveloppant la fonction médiane afin de supprimer d'être interprété comme une variable dans le data.frame.

Existe-t-il un moyen plus élégant de réaliser la même chose?

+4

J'ai copié votre code et j'ai obtenu une erreur différente: "La colonne" ln_median_10 "doit avoir une longueur de 100 (le nombre de lignes) ou une, pas 96". J'ai corrigé en ajoutant le paramètre 'fill = NA' à' rollapply' – lebelinoz

+0

De quel paquet est 'rollapply'? est-ce 'zoo'? – useR

Répondre

0

Comme @lebelinoz mentionné dans les commentaires, vous pouvez utiliser fill = NA pour résoudre l'erreur de longueur inégale. Pas capable de reproduire votre erreur si. Notez également que mutate vous permet d'utiliser une variable que vous venez de créer dans la même fonction. Donc pas besoin de la deuxième mutate:

library(zoo) 

df %>% 
    mutate(ln_median = log(median), 
     ln_median_10 = rollapply(ln_median, 5, median, fill = NA)) 
0

Si c'était vraiment la question (mais je ne peux pas reproduire non plus), vous pouvez utiliser match.fun("median") au lieu de median

1

Avez-vous essayé de passer la fonction nom en tant que

stats::median