2014-12-08 5 views
34

Ich versuche, eine neue Variable aus Art von Zeilenberechnung zu mutieren, sagen rowSums wie untendplyr rowSums Berechnungen oder benutzerdefinierte Funktionen mutiert

iris %>% 
    mutate_(sumVar = 
      iris %>% 
      select(Sepal.Length:Petal.Width) %>% 
      rowSums) 

das Ergebnis ist, dass „sumVar“ zu seinem ersten Wert abgeschnitten (10.2):

Source: local data frame [150 x 6] 
Groups: <by row> 

    Sepal.Length Sepal.Width Petal.Length Petal.Width Species sumVar 
1   5.1   3.5   1.4   0.2 setosa 10.2 
2   4.9   3.0   1.4   0.2 setosa 10.2 
3   4.7   3.2   1.3   0.2 setosa 10.2 
4   4.6   3.1   1.5   0.2 setosa 10.2 
5   5.0   3.6   1.4   0.2 setosa 10.2 
6   5.4   3.9   1.7   0.4 setosa 10.2 
.. 
Warning message: 
Truncating vector to length 1 

es sein sollte rowwise angewendet? Oder was ist das richtige Verb für diese Art von Berechnungen.

Edit:

Genauer gesagt ist es eine Möglichkeit, die Inline-benutzerdefinierte Funktion mit dplyr zu realisieren?

Ich frage mich, ob es möglich ist, wie etwas tun:

iris %>% 
    mutate(sumVar = colsum_function(Sepal.Length:Petal.Width)) 
+2

Wirklich seltsam, dass 'Iris%>% wählen (Sepal.Length: Petal.Width)%>% rowSums()' funktioniert gut, aber 'Iris%>% mutieren (sumVar = Iris%>% wählen (Sepal .Length: Petal.Width)%>% rowSums()) 'wirft eine" Error: Bad indices 1 "+ Warnmeldung. –

+0

Ich versuche, mit verschiedenen Ansätzen daran zu arbeiten, aber dieser Fehler erscheint sehr häufig mit '.' (Ich mache manchmal auch etwas Dummes). –

Antwort

53

Dies ist eher eine Abhilfe könnte aber

iris %>% mutate(sumVar = rowSums(.[1:4])) 

Wie in den Kommentaren geschrieben verwendet werden, können Sie Verwenden Sie auch select innerhalb von muate, um die Spalten zu erhalten, die Sie zusammenfassen möchten, zum Beispiel

iris %>% 
    mutate(sumVar = rowSums(select(., contains("Sepal")))) %>% 
    head 

oder

iris %>% 
    mutate(sumVar = select(., contains("Sepal")) %>% rowSums()) %>% 
    head 
+0

Welche Version von 'dplyr' benutzt du? Wenn ich ein Beispiel mit 'dplyr_0.4.1' versuche, erhalte ich eine Ausnahme:' Fehler in is.data.frame (x): object '.' nicht gefunden. – Jubbles

+1

Wenn es für irgendjemanden von Nutzen ist, erhielt ich den Fehler "Fehler in is.data.frame (x): object '." nicht gefunden "war, weil ich eine alte Version von' magrittr' hatte. Als ich von 'magrittr_1.0.1' zu' magrittr_1.5' aktualisierte, funktionierte alles gut. – Jubbles

+0

Diese sehr nützliche Antwort, ich habe mich gefragt, ob es möglich wäre, zu expandieren, indem man dplyrs ** 'match' ** oder **' contains' ** anstelle der '. [1: 4]'? – Konrad

9

Ein komplizierterer Weg wäre:

iris %>% select(Sepal.Length:Petal.Width) %>% 
mutate(sumVar = rowSums(.)) %>% left_join(iris) 
+0

Danke Davide. 'left_join' hört sich gut an, wenn man es mit' by'-Taste benutzt; Es ist jedoch nicht so robust und intuitiv für diesen Umstand – leoluyi

5

als Antwort Hinzufügen Kommentar der @ docendodiscimus. +1 zu ihm!

iris %>% mutate(sumVar = rowSums(select(., contains("Sepal")))) 
Verwandte Themen