【问题标题】:Aggregate multiple columns at once [duplicate]一次聚合多个列[重复]
【发布时间】:2016-04-04 01:59:31
【问题描述】:

我有一个类似的数据框:

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

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

【问题讨论】:

    标签: r aggregate


    【解决方案1】:

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

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

    或者我们可以在分组后使用dplyr中的summarise_each (group_by)

    library(dplyr)
    df1 %>%
        group_by(id1, id2) %>% 
        summarise_each(funs(mean))
    

    或使用summariseacrossdplyr 开发版 - ‘0.8.99.9000’

    df1 %>% 
        group_by(id1, id2) %>%
        summarise(across(starts_with('val'), 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"))
    

    【讨论】:

    • 感谢您的评论。 df1 是否应该是一个不需要定义的函数?如果您能解释上述语法将非常有帮助
    • @Rookie df1 是 data.frame 对象
    • 如果它真的是一个笛卡尔积,那么聚合版本中涉及总和的公式的直觉是什么?或者可能是将总和视为唯一的识别值?因此,即 (a,x) 和 (a,y) 由 a+x != a+y 标识,而不是 (a=a,x!=y)。
    【解决方案2】:

    你可以试试:

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

    【讨论】:

    • 请详细说明您的答案-评论
    • 进展顺利 (+1)。因此,如果您提供一个列表而不是向量作为参数 x(第一个),aggregate 将计算列表中每个值的聚合。
    • 此外,您可以重命名从aggregate 调用返回的所有列,方法是为每个列表组件命名,例如agg &lt;- aggregate(list(val1=x$val1, val2=x$val2, val3=x$val3, val4=x$val4), by = list(id1=x$id1, id2=x$id2), mean)。这将替换 aggregate 分配的默认列名。
    • 我也可以更改每个聚合的功能吗? (例如:sum val1 但取 val2 和 val3 的平均值)
    • 它会自动对列进行排序,这在每种情况下都是不可取的
    猜你喜欢
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2019-10-08
    • 1970-01-01
    • 2018-03-02
    • 2013-06-15
    • 2019-02-09
    相关资源
    最近更新 更多