【问题标题】:R: How to sum up (aggregate) values of dfs according to column criteria within a list?R:如何根据列表中的列标准总结(聚合)dfs的值?
【发布时间】:2015-10-27 20:03:57
【问题描述】:

我想在 dfs 列表中汇总来自同一国家/地区的所有值(df-wise!)。这里有一些示例数据:

df1 <- data.frame(CNTRY = c("A", "B", "C"), Value=c(3,1,4))
df2 <- data.frame(CNTRY = c("A", "B", "C", "C"),Value=c(3,5,8,7))
dfList <- list(df1, df2)
names(dfList) <- c("111.2000", "112.2000")

我的列表由具有不同行号的 dfs(仅 dfs)组成, 但所有 dfs 的列结构相同。列表名称是 articleID 和 Year 的混合体,超过 1000 个 dfs。 现在我的问题是:如何总结或汇总所有 dfs 中的国家/地区值? 我的预期结果是:

$`111.2000`
  CNTRY Value
1     A     3
2     B     1
3     C     4

$`112.2000`
  CNTRY Value
1     A     3
2     B     5
3     C    15

我尝试了aggregate(Value ~ CNTRY, data=dfList,FUN=sum),它提供了一条错误消息,因为CNTRYVALUE 不是对象,而是对象中的列。有任何想法吗?提前致谢。

【问题讨论】:

    标签: r list sum aggregate


    【解决方案1】:

    使用lapply()aggregate() 函数应用于dfList

    lapply(dfList, function(x) aggregate(Value ~ CNTRY, x, sum))
    # $`111.2000`
    #   CNTRY Value
    # 1     A     3
    # 2     B     1
    # 3     C     4
    #
    # $`112.2000`
    #   CNTRY Value
    # 1     A     3
    # 2     B     5
    # 3     C    15
    

    【讨论】:

    • 哦,我开始明白 lapply 了,非常感谢,我是列表新手。
    【解决方案2】:

    一个 DF 列表比野外的一堆 DF 更好,但单个 DF 甚至更好:

    library(data.table)
    DF = rbindlist(dfList, idcol="id")
    
             id CNTRY Value
    1: 111.2000     A     3
    2: 111.2000     B     1
    3: 111.2000     C     4
    4: 112.2000     A     3
    5: 112.2000     B     5
    6: 112.2000     C     8
    7: 112.2000     C     7
    

    从那里,您可以根据 data.table 语法进行聚合

    DTres <- DF[, .(Value = sum(Value)), by=.(id, CNTRY)]
    
             id CNTRY Value
    1: 111.2000     A     3
    2: 111.2000     B     1
    3: 111.2000     C     4
    4: 112.2000     A     3
    5: 112.2000     B     5
    6: 112.2000     C    15
    

    从这里,你可以做类似的事情

    dcast(DTres, id ~ CNTRY)
    
             id A B  C
    1: 111.2000 3 1  4
    2: 112.2000 3 5 15
    

    我确信在 base R 中也有一些方法可以做到这一点,但我想说不要打扰。

    【讨论】:

    • 我就知道你会这么做;)
    • @RichardScriven 我可以这样预测。最后我尝试在我的DF 上使用aggregate,但无法让它为我的生活服务。既不是cbind(id,CNTRY) ~ Value 也不是Value ~ cbind(id,CNTRY) 也不是grr ~ argh
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 2021-07-24
    • 2020-12-23
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多