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
出什么问题了?
答案 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.table
与library(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])))