如何将dplyr的管道与聚合一起使用

时间:2019-08-10 14:31:41

标签: r dplyr

df<-data.frame(gender = c('A', 'B', 'B','B','A'),q01 = c(1, 6, 3,8,5),q02 = c(5, 3, 6,5,2)) 
  gender q01 q02
1      A   1   5
2      B   6   3
3      B   3   6
4      B   8   5
5      A   5   2

我要计算q01*2+q02,然后按mean组获得gender,预期结果如下:

A 9.5
B 16

我尝试但失败了:

 df %>% aggregate(c(q01,q02)~gender,mean(q01*2+q02))
  

均值(q01 * 2 + q02)中的错误:找不到对象'q01'

df %>% group_by(gender) %>% mean(.$q01*2+.$q02)
[1] NA
  

警告信息:       在mean.default(。,。$ q01 * 2 +。$ q02)中:         参数不是数字或逻辑:返回NA

出什么问题了?

3 个答案:

答案 0 :(得分:2)

最好将wchar_t和基本方法分开。他们每个人都有自己的数据处理方式。使用dplyr,您可以

dplyr

并使用基数R library(dplyr) df %>% mutate(q = q01 * 2 + q02) %>% group_by(gender) %>% summarise(q = mean(q)) # gender q # <fct> <dbl> #1 A 9.5 #2 B 16

aggregate

答案 1 :(得分:2)

使用相同的逻辑c:

  df %>% 
   do(aggregate(I(q01*2)+q02~gender,
             data=.,mean)) %>% 
   setNames(.,nm=c("gender","q"))
  gender    q
1      A  9.5
2      B 16.0

注意: 我确实注意到do的生命周期被标记为正在提问。

答案 2 :(得分:2)

dplyr + aggregate的OP代码中,data并未与使用c一起指定,即将两列连接在一起。还有,

aggregate(c(q01,q02)~gender,df, mean(q01*2+q02))
  

model.frame.default中的错误(公式= c(q01,q02)〜性别,数据=   df):可变长度不同(针对“性别”)

在这里,c(q01, q02)就像连接c(1:5, 6:10)一样,现在长度将是以前的两倍,并且使用的FUN不会得到评估找不到'q01'或'q02'

相反,我们可以cbind使用formula的{​​{1}}方法创建新列,然后获取aggregate

mean

注意:在library(dplyr) df %>% aggregate(cbind(q = q01 * 2 + q02) ~ gender, data = ., mean) # gender q #1 A 9.5 #2 B 16.0 中,可以用dplyr指定来自lhs的{​​{1}}的数据。

注2:在这里,我们假设问题是要了解如何使%>%.中工作。如果只是为了获取aggregate,则整个过程可以使用%>%

完成
mean

或使用dplyr方法

f1 <- function(x, y, val) mean(x * val + y)
df %>%
    group_by(gender) %>%
    summarise(q = f1(q01, q02, 2))

或将data.tablelibrary(data.table) setDT(df)[, .(q = mean(q01 * 2 + q02)), .(gender)] # gender q #1: A 9.5 #2: B 16.0 一起使用

base R

或与by

stack(by(df[-1], df[1], FUN = function(x) mean(x[,1] * 2 + x[,2])))