【问题标题】:How to apply a function to grouped rows in R [duplicate]如何将函数应用于R中的分组行[重复]
【发布时间】:2016-10-10 23:08:47
【问题描述】:

我有一个由

生成的数据框
points_A = sample(1:6,6)
points_B = sample(1:6,6)
points_C = sample(1:6,6)
df <- data.frame( name = gl(3,2,labels=c("Luca","Mario","Paolo") ) , cbind(points_A,points_B,points_C)  )

显示为

   name points_A points_B points_C
1  Luca        5        2        3
2  Luca        3        3        1
3 Mario        1        5        2
4 Mario        6        6        4
5 Paolo        4        4        5
6 Paolo        2        1        6

我想对按列名(第一列)分组的行应用一个函数(例如 sum() )。

输出应该是这样的:

   name points_A points_B points_C
1  Luca        8        5        4
2  Mario       7       11        6
3  Paolo       6        5       11

有什么建议吗?

【问题讨论】:

  • aggregate(. ~ name, df, sum),或在 dplyr 中,df %&gt;% group_by(name) %&gt;% summarise_all(sum)
  • aggregate(. ~ name, df, sum) 这是有效的,但如果我还有其他列,如姓氏、城市等,我仍然想要在数据框中但我不想传递给聚合,因为它们是另一种数据类型?有没有办法指定哪些内容不能进入?

标签: r dataframe dplyr apply


【解决方案1】:

我喜欢用data.table做这些事情

library(data.table); dt<-data.table(df) ; dt[, function(column), by = group] 作为“列”,您还可以设置.SD 以获取多个列。在您的示例中,“组”将是“名称”。

【讨论】:

    【解决方案2】:

    data.table 的(相当原始的)解决方案

    require(data.table)
    setDT(df)
    df[, lapply(.SD, sum), by = name, .SDcols = 2:4]
    
        name points_A points_B points_C
    1:  Luca        9        6        6
    2: Mario        5       10       11
    3: Paolo        7        5        4
    

    编辑: 基础R 中的原始解决方案:

    t(sapply(split(df, df$name), function(x) colSums(x[, c("points_A", "points_B", "points_C")])))
    

    【讨论】:

    • 输出与数据的随机性质不同。下一个问题最好set.seed
    • 当然。谢谢。我只是认为结果不会影响我要求的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2011-07-16
    • 2014-09-05
    • 2016-09-24
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多