【问题标题】:R summing up total for each class for each idR 为每个 id 的每个类汇总总计
【发布时间】:2017-05-24 15:45:29
【问题描述】:

假设我有一个这样的数据集:

df <- data.frame(id = c(1, 1, 1, 2, 2),
      classname = c("Welding", "Welding", "Auto", "HVAC", "Plumbing"),
      hours = c(3, 2, 4, 1, 2))  

即,

   id  classname  hours
1   1   Welding     3
2   1   Welding     2
3   1   Auto        4
4   2   HVAC        1
5   2   Plumbing    2

我试图弄清楚如何以一种方式汇总数据,以便为每个 ID 提供他们所学课程的列表以及每节课的小时数。我希望这些都在一个列表中,这样我就可以在每个 ID 中保留一行。所以,我希望它返回:

   id     class.list     class.hours
1   1    Welding, Auto       5,4   
2   2    HVAC, Plumbing      1,2    

我能够弄清楚如何让它返回 class.list。

library(dplyr)
classes <- df %>%
group_by(id) %>%
summarise(class.list = list(unique(as.character(classname)))) 

这给了我:

   id     class.list     
1   1    Welding, Auto         
2   2    HVAC, Plumbing      

但我不确定如何将每个课程的小时数相加(class.hours)。

感谢您的帮助!

【问题讨论】:

    标签: r dplyr summarize


    【解决方案1】:

    在基础 R 中,这可以通过两次调用 aggregate 来完成。内部调用汇总小时数,外部调用“连接”小时数和类名。在aggregate 的外部调用中,cbind 用于在输出中包含小时和类名,并提供所需的变量名。

    # convert class name to character variable
    df$classname <- as.character(df$classname)
    # aggregate
    aggregate(cbind("class.hours"=hours, "class.list"=classname)~id,
              data=aggregate(hours~id+classname, data=df, FUN=sum), toString)
      id class.hours     class.list
    1  1        4, 5  Auto, Welding
    2  2        1, 2 HVAC, Plumbing
    

    data.table 中,使用链式语句产生大致相同的输出。

    setDT(df)[, .(hours=sum(hours)), by=.(id, classname)][, lapply(.SD, toString), by=id]
       id      classname hours
    1:  1  Welding, Auto  5, 4
    2:  2 HVAC, Plumbing  1, 2
    

    然后可以使用 data.table setnames 函数设置变量名称。

    【讨论】:

      【解决方案2】:

      这是使用 dplyr 的方法:

      classes <- df %>%
        group_by(id, classname) %>%
        summarise(hours = sum(hours)) %>%
        summarise(class.list = list(unique(as.character(classname))),
                  class.hours = list(hours)) 
      

      第一个按(类名)汇总最新组的果皮。不再需要使用 unique(),但我将其保留在其中以匹配您已有的部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-07
        • 1970-01-01
        • 2023-01-08
        • 2019-05-10
        • 2011-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多