如何按组获得平均值?

时间:2014-08-05 02:09:46

标签: r grouping aggregate

我想通过组低和高得到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


4 个答案:

答案 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

如果您想取lowhigh以外的每个列的平均值,.就很方便,意思是"所有其他列":

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
>