Comment passer des dynamiques des noms de colonne dans dplyr en fonction personnalisée?
J'ai un jeu de données avec la structure suivante:
Classes ‘tbl_df’ and 'data.frame': 10 obs. of 7 variables:
$ GdeName : chr "Aeugst am Albis" "Aeugst am Albis" "Aeugst am Albis" "Aeugst am Albis" ...
$ Partei : chr "BDP" "CSP" "CVP" "EDU" ...
$ Stand1971: num NA NA 4.91 NA 3.21 ...
$ Stand1975: num NA NA 5.389 0.438 4.536 ...
$ Stand1979: num NA NA 6.2774 0.0195 3.4355 ...
$ Stand1983: num NA NA 4.66 1.41 3.76 ...
$ Stand1987: num NA NA 3.48 1.65 5.75 ...
Je veux fournir une fonction qui permet de calculer la différence entre la valeur, et je tiens à le faire à l'aide de dplyr
s mutate
fonction comme suit: (en supposant les paramètres from
et to
sont passés comme arguments)
from <- "Stand1971"
to <- "Stand1987"
data %>%
mutate(diff = from - to)
Bien sûr, cela ne fonctionne pas, comme dplyr
utilise non-standard d'évaluation. Et je sais qu'il y a maintenant une solution élégante au problème à l'aide de mutate_
, et j'ai lu cette vignette, mais je ne peux toujours pas obtenir ma tête autour de lui.
Quoi faire?
Voici les premières lignes du jeu de données pour un exemple reproductible
structure(list(GdeName = c("Aeugst am Albis", "Aeugst am Albis",
"Aeugst am Albis", "Aeugst am Albis", "Aeugst am Albis", "Aeugst am Albis",
"Aeugst am Albis", "Aeugst am Albis", "Aeugst am Albis", "Aeugst am Albis"
), Partei = c("BDP", "CSP", "CVP", "EDU", "EVP", "FDP", "FGA",
"FPS", "GLP", "GPS"), Stand1971 = c(NA, NA, 4.907306434, NA,
3.2109535926, 18.272143463, NA, NA, NA, NA), Stand1975 = c(NA,
NA, 5.389079711, 0.4382328556, 4.5363022622, 18.749259742, NA,
NA, NA, NA), Stand1979 = c(NA, NA, 6.2773722628, 0.0194647202,
3.4355231144, 25.294403893, NA, NA, NA, 2.7055961071), Stand1983 = c(NA,
NA, 4.6609804428, 1.412940467, 3.7563539244, 26.277246489, 0.8529335746,
NA, NA, 2.601878177), Stand1987 = c(NA, NA, 3.4767860929, 1.6535933856,
5.7451770193, 22.146844746, NA, 3.7453183521, NA, 13.702211858
)), .Names = c("GdeName", "Partei", "Stand1971", "Stand1975",
"Stand1979", "Stand1983", "Stand1987"), class = c("tbl_df", "data.frame"
), row.names = c(NA, -10L))
- Il n'a pas répondu à votre question, mais de deviner à partir du contexte, vous pourriez être mieux avec un bon ensemble de données que vous pouvez simplement utiliser
lead(x) - x
pour calculer les différences entre les valeurs suivantes pour toutes les années à la fois.
Vous devez vous connecter pour publier un commentaire.
À l'aide de la dernière version de dplyr (>=0.7), vous pouvez utiliser le
rlang
!!
(bang-bang) de l'opérateur.Vous avez juste besoin de convertir les chaînes de caractères pour les noms avec
as.name
et les insérer dans l'expression. Malheureusement, il me semble avoir à utiliser un peu plus de la parenthèse que je le voudrais, mais la!!
opérateur semble tomber dans une étrange ordre des opérations de commande.Réponse originale à cette question, dplyr (0.3-<0.7):
De cette vignette (
vignette("nse","dplyr")
), l'utilisation lazyeval deinterp()
fonctionpaste
?mutate(!!diff :=(!!as.name(from))-(!!as.name(to)))
. Le:=
vous permet de changer le nom de la nouvelle colonne sur la gauche du signe égal. Voir stackoverflow.com/q/26003574/2372064