2017-02-11 7 views
2

zu versetzen, die sum einer data.frame Spalte in einer Variablen ich das getan hätte zu bekommen:bessere Möglichkeit, die Summe einer data.frame Spalte in R mit dplyr

library(dplyr) 
data <- data.frame("x" = c(1,2,3), "y" = c("a","b","c")) 
way01 <- data %>% filter(y == "d") %>% summarise(total = sum(x)) %>% .$total 
way02 <- data %>% filter(y == "d") %>% .$x %>% sum 

Ich fühle es ungeschickt ist summarise(total = sum(x)) %>% .$total oder %>% .$x %>% sum zu tun . Es gibt eine elegantere Art, das zu tun?

Ich möchte etwas wie %>% sum(.$x), aber es funktioniert nicht.

PS: es ist Vorschlag, "d" als Filter zu verwenden, um einen Fall zu behandeln, wo numeric(0) kein Problem ist.

+0

Wenn Sie nach einer kompakten Option suchen, dann 'Basis R'' mit (Daten, Summe (x [y == "d"])) – akrun

+0

@akrun tks. Aber es ist ein Spielzeugcode für ein größeres Beispiel mit 'dplyr'. – Murta

Antwort

4

Sie %$% statt %>% verwenden direkten Zugriff auf Spalten haben:

> data %>% filter(y == "d") %$% sum(x) 
[1] 0 
+0

oder 'Daten% $% Summe (x [y ==" d "])' vielleicht? : D – Aramis7d

2

Sie könnten nach sein:

way03 <- data %>% filter(y == "d") %>% { sum(.$x) } 

Die Verwendung von { } in erklärt:

?magrittr::`%>%` 
1

Da es mit einer Zusammenfassung verwendet wird, können Sie immer unsauberer Trick R und verwendet:

data %>% summarise(total = sum(x[y == "d"])) %>% first() 

oder sogar

data %>% summarise(sum(x[y == "d"])) %>% first() 

, die zurückgibt:

[1] 0 

Auch dies zu last() entspricht, nth(n=1) und nth(n=-1) für dieses Szenario.

Verwandte Themen