2017-02-11 8 views
2

Чтобы поместить sum в виде data.frame столбца в переменной я сделал, что:лучший способ, чтобы получить сумму столбца data.frame в R с 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 

Я чувствую, что это неуклюжая сделать summarise(total = sum(x)) %>% .$total или %>% .$x %>% sum , Есть более элегантный способ сделать это?

Я хотел бы что-то вроде %>% sum(.$x), но это не сработает.

PS: предлагается использовать "d" в качестве фильтра, для обработчика случая, где numeric(0) не проблема.

+0

Если вы ищете компактную опцию, тогда 'base R'' с (data, sum (x [y ==" d "]))' – akrun

+0

@akrun tks. Но это игрушечный код для большего примера с 'dplyr'. – Murta

ответ

4

Вы можете использовать %$% вместо %>%, чтобы иметь прямой доступ к столбцам:

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

или 'data% $% sum (x [y ==" d "])' может быть? : D – Aramis7d

2

Вы можете быть после того, как:

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

Использование { } объясняется:

?magrittr::`%>%` 
1

Поскольку он используется с резюме, вы всегда можете обмануть R и использовать грязные хаки:

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

или даже

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

, которая возвращает:

[1] 0 

Опять же, это эквивалентно last(), nth(n=1) и nth(n=-1) для этого сценария.