web-dev-qa-db-fra.com

dplyr: comment référencer les colonnes par index de colonne plutôt que par nom de colonne en utilisant mutate?

En utilisant dplyr, vous pouvez faire quelque chose comme ceci:

iris %>% head %>% mutate(sum=Sepal.Length + Sepal.Width) 
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species sum
1          5.1         3.5          1.4         0.2  setosa 8.6
2          4.9         3.0          1.4         0.2  setosa 7.9
3          4.7         3.2          1.3         0.2  setosa 7.9
4          4.6         3.1          1.5         0.2  setosa 7.7
5          5.0         3.6          1.4         0.2  setosa 8.6
6          5.4         3.9          1.7         0.4  setosa 9.3

Mais ci-dessus, j'ai référencé les colonnes par leurs noms de colonne. Comment utiliser 1 et 2, qui sont les index de colonne permettant d'obtenir le même résultat?

Ici, j'ai ce qui suit, mais j'estime que ce n'est pas aussi élégant. 

iris %>% head %>% mutate(sum=apply(select(.,1,2),1,sum))
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species sum
1          5.1         3.5          1.4         0.2  setosa 8.6
2          4.9         3.0          1.4         0.2  setosa 7.9
3          4.7         3.2          1.3         0.2  setosa 7.9
4          4.6         3.1          1.5         0.2  setosa 7.7
5          5.0         3.6          1.4         0.2  setosa 8.6
6          5.4         3.9          1.7         0.4  setosa 9.3
23
Alby

Tu peux essayer:

iris %>% head %>% mutate(sum = .[[1]] + .[[2]])

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species sum
1          5.1         3.5          1.4         0.2  setosa 8.6
2          4.9         3.0          1.4         0.2  setosa 7.9
3          4.7         3.2          1.3         0.2  setosa 7.9
4          4.6         3.1          1.5         0.2  setosa 7.7
5          5.0         3.6          1.4         0.2  setosa 8.6
6          5.4         3.9          1.7         0.4  setosa 9.3
39
jeremycg

Pour résoudre le problème que @pluke pose dans les commentaires, dplyr ne supporte pas vraiment l'index de colonne .

Pas une solution parfaite, mais vous pouvez utiliser la base R pour contourner ce problème iris[1] <- iris[1] + iris[2]

1
Nina Sonneborn

Je suis un peu en retard au jeu, mais ma stratégie personnelle dans des cas comme celui-ci consiste à écrire ma propre fonction/ tidyverse qui fera exactement ce que je veux. Par tidyverse-compliant, je veux dire que le premier argument de la fonction est une trame de données et que la sortie est un vecteur pouvant être ajouté à la trame de données.

sum_cols <- function(x, col1, col2){
   x[[col1]] + x[[col2]]
}

iris %>%
  head %>%
  mutate(sum = sum_cols(x = ., col1 = 1, col2 = 2))
0
SavedByJESUS