我有一个数据框喜欢:
x <- id1 id2 val1 val2 val3 val4 1 a x 1 9 2 a x 2 4 3 a y 3 5 4 a y 4 9 5 b x 1 7 6 b y 4 4 7 b x 3 9 8 b y 2 8
我希望通过id1和id2汇总上面的内容.我希望能够同时获得val1,val2,val3,val4的平均值.
我该怎么做呢?
这是我目前拥有的,但它只适用于1列:
agg <- aggregate(x$val1, list(id11 = x$id1, id2= x$id2), mean) names(agg)[3] <- c("val1") # Rename the column
另外,如何重命名在上面给出的相同语句中作为均值输出的列
我们可以使用公式方法aggregate
.'rhs'上~
的变量是分组变量,而.
'df1'代表所有其他变量(从示例中,我们假设我们需要mean
除分组之外的所有其他列),指定数据集和函数(mean
).
aggregate(.~id1+id2, df1, mean)
或者我们可以使用summarise_each
从dplyr
分组后(group_by
)
library(dplyr) df1 %>% group_by(id1, id2) %>% summarise_each(funs(mean))
或者另一个选择是data.table
.我们将'data.frame'转换为'data.table'(setDT(df1)
由'id1'和'id2'分组,我们循环遍历data.table(.SD
)的子集并得到mean
.
library(data.table) setDT(df1)[, lapply(.SD, mean), by = .(id1, id2)]
df1 <- structure(list(id1 = c("a", "a", "a", "a", "b", "b", "b", "b" ), id2 = c("x", "x", "y", "y", "x", "y", "x", "y"), val1 = c(1L, 2L, 3L, 4L, 1L, 4L, 3L, 2L), val2 = c(9L, 4L, 5L, 9L, 7L, 4L, 9L, 8L)), .Names = c("id1", "id2", "val1", "val2"), class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "7", "8"))
你可以尝试:
agg <- aggregate(list(x$val1, x$val2, x$val3, x$val4), by = list(x$id1, x$id2), mean)