如何根据某些标准计算平均值(或任何其他函数)

时间:2014-08-19 13:22:20

标签: r dataframe grouping

我是R的全新手,我需要一些我无法找到的东西。我想我不知道如何谷歌,所以让我解释一下我的问题。让我们假设我有一个像这样的数据帧。

    criteria1    criteria2    data1    data2    data3
1           1          foo        2        1        3
2           1          foo        3        2        1
3           1          bar        2        1        3
4           2          foo        5        2        7
5           2          bar        8        2        3
6           1          bar        3        6        9
7           2          bar        2        5        6
8           3          xyz        2        5        6

我想计算data1,data2和data3的平均值,按criteria1和criteria2分组并维护数据框结构(列名)。结果应该是这样的:

    criteria1    criteria2    data1    data2    data3
1           1          foo      2.5      1.5        2
2           1          bar      2.5      3.5        6
3           2          foo        5        2        7
4           2          bar        5      3.5      4.5
5           3          xyz        2        5        6

所以,我想知道如何在R中编码。谢谢。

3 个答案:

答案 0 :(得分:4)

这是一个选项:

library(dplyr)

df %>%
  group_by(criteria1, criteria2) %>%
  summarise_each(funs(mean))

#Source: local data frame [5 x 5]
#Groups: criteria1
#
#  criteria1 criteria2 data1 data2 data3
#1         1       bar   2.5   3.5   6.0
#2         1       foo   2.5   1.5   2.0
#3         2       bar   5.0   3.5   4.5
#4         2       foo   5.0   2.0   7.0
#5         3       xyz   2.0   5.0   6.0

或者

aggregate(cbind(data1, data2, data3) ~ criteria1 + criteria2, data = df, mean)
#  criteria1 criteria2 data1 data2 data3
#1         1       bar   2.5   3.5   6.0
#2         2       bar   5.0   3.5   4.5
#3         1       foo   2.5   1.5   2.0
#4         2       foo   5.0   2.0   7.0
#5         3       xyz   2.0   5.0   6.0

答案 1 :(得分:3)

或使用聚合:

aggregate(df[ , 3:5], by = list(criteria1 = df$criteria1, criteria2 = df$criteria2), mean)

答案 2 :(得分:3)

data.table解决方案。

require(data.table)

n <- 8

dt <- data.table(criteria1 = sample(3, n, replace = T),
                 criteria2 = sample(c("foo", "bar", "xyz"), n, replace = T),
                 data1 = sample(9, n, replace = T),
                 data2 = sample(9, n, replace = T),
                 data3 = sample(9, n, replace = T))

dt[, lapply(.SD, mean), keyby = list(criteria1, criteria2)]