我想通过组低和高得到var1和var2的平均值。 如何按组(低和高)分别获得两个变量的平均值?
ID var1 var2 low high
1 1 6 0 1
2 2 7 0 1
3 3 8 1 0
4 4 9 1 0
5 5 10 0 1
答案 0 :(得分:3)
aggregate
可以满足您的需求。
要获取多列的聚合,您可以cbind
它们,以便它们在结果中是单独的列:
aggregate(cbind(var1, var2) ~ low+high, data=x, FUN=mean)
## low high var1 var2
## 1 1 0 3.500000 8.500000
## 2 0 1 2.666667 7.666667
如果您想取low
和high
以外的每个列的平均值,.
就很方便,意思是"所有其他列":
aggregate(. ~ low+high, data=x, FUN=mean)
## low high ID var1 var2
## 1 1 0 3.500000 3.500000 8.500000
## 2 0 1 2.666667 2.666667 7.666667
请注意,如果+
位于~
的右侧,则{{1}}在公式中具有特殊含义。它并不意味着总和,但它意味着使用这两个因素。在左侧,这意味着添加。
答案 1 :(得分:1)
dplyr
解决方案:
ID<-c(1:5)
var1<-c(1:5)
var2<-c(6:10)
low<-c(0,0,1,1,0)
high<-c(1,1,0,0,1)
mydf<-data.frame(ID,var1,var2,low,high)
library(dplyr)
mydf %>%
group_by(low, high) %>%
summarise(mean_var1=mean(var1), mean_var2=mean(var2))
给你:
low high mean_var1 mean_var2
1 0 1 2.666667 7.666667
2 1 0 3.500000 8.500000
正如Richard Scriven所指出的那样,你可能在谈论你想要的var 1和var 2的总和,在这种情况下:
library(dplyr)
mydf %>%
mutate(sum_vars=var1+var2) %>%
group_by(low, high) %>%
summarise(mean_sumvars=mean(sum_vars))
low high mean_sumvars
1 0 1 10.33333
2 1 0 12.00000
答案 2 :(得分:1)
以下是使用data.table
library(data.table)
setDT(df1)[, lapply(.SD, mean) ,.(low, high), .SDcols = var1:var2]
# low high var1 var2
#1: 0 1 2.666667 7.666667
#2: 1 0 3.500000 8.500000
和第二种情况
setDT(df1)[, .(sumvars = Reduce(`+`, lapply(.SD, mean))) ,.(low, high), .SDcols = var1:var2]
# low high sumvars
#1: 0 1 10.33333
#2: 1 0 12.00000
答案 3 :(得分:0)
对于个别变量,tapply也非常方便,特别是如果有多个组:
> with (dat, tapply(var1, list(low, high), mean))
0 1
0 NA 2.666667
1 3.5 NA
>
>
> with (dat, tapply(var2, list(low, high), mean))
0 1
0 NA 7.666667
1 8.5 NA
>
>
> with (dat, tapply(var1+var2, list(low, high), mean))
0 1
0 NA 10.33333
1 12 NA
>