当前位置:  开发笔记 > 编程语言 > 正文

一次聚合多个列

如何解决《一次聚合多个列》经验,为你挑选了2个好方法。

我有一个数据框喜欢:

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

另外,如何重命名在上面给出的相同语句中作为均值输出的列



1> akrun..:

我们可以使用公式方法aggregate.'rhs'上~的变量是分组变量,而.'df1'代表所有其他变量(从示例中,我们假设我们需要mean除分组之外的所有其他列),指定数据集和函数(mean).

aggregate(.~id1+id2, df1, mean)

或者我们可以使用summarise_eachdplyr分组后(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"))



2> 小智..:

你可以尝试:

agg <- aggregate(list(x$val1, x$val2, x$val3, x$val4), by = list(x$id1, x$id2), mean)


此外,您可以通过为每个列表组件指定名称来重命名从`aggregate`调用返回的所有列,例如`agg < - aggregate(list(val1 = x $ val1,val2 = x $ val2,val3 = x $ val3) ,val4 = x $ val4),by = list(id1 = x $ id1,id2 = x $ id2),mean)`.这将替换`aggregate`指定的默认列名.
我还可以更改每个聚合的功能吗?(例如:求和val1但取val2和val3的平均值)
推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有