wake-up-neo.net

dplyr: wie referenziert man Spalten anhand des Spaltenindex und nicht den Spaltennamen mit mutate?

Mit dplyr können Sie so etwas tun:

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

Aber oben habe ich die Spalten anhand ihrer Spaltennamen referenziert. Wie kann ich mit 1 und 2 die Spaltenindizes verwenden, um dasselbe Ergebnis zu erzielen?

Hier habe ich Folgendes, aber ich finde, dass es nicht so elegant ist. 

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

Du kannst es versuchen:

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

Um das Problem zu lösen, das @pluke in den Kommentaren anspricht, unterstützt dplyr den Spaltenindex nicht wirklich.

Keine perfekte Lösung, aber Sie können die Basis R verwenden, um diesen Code zu umgehen iris[1] <- iris[1] + iris[2]

1
Nina Sonneborn

Ich bin ein bisschen spät im Spiel, aber meine persönliche Strategie in solchen Fällen besteht darin, meine eigene tidyverse-kompatible Funktion zu schreiben, die genau das tut, was ich will. Mit tidyverse-konform meine ich, dass das erste Argument der Funktion ein Datenrahmen ist und dass die Ausgabe ein Vektor ist, der dem Datenrahmen hinzugefügt werden kann.

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

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