【问题标题】:Sum the columns in a list of dataframes对数据框列表中的列求和
【发布时间】:2016-11-01 23:32:26
【问题描述】:

我想从数据框列表中生成一个数据框,其中所有列都相同,除了一列“收入”应该是列表中所有“收入”的总和。

这是我的数据框列表

mylist= structure(list(`1` = structure(list(ID = c(36L, 37L, 38L, 39L), Income = c(0, 0, 0, 9100)), .Names = c("ID", "Income"), row.names = c(1L, 2L, 3L, 4L), class = "data.frame"), `2` = structure(list(ID = c(36L, 37L, 38L, 39L), Income = c(0, 0, 0, 0)), .Names = c("ID", "Income"), row.names = c(1L, 2L, 3L, 4L), class = "data.frame"), `3` = structure(list(ID = c(36L, 37L, 38L, 39L), Income = c(7360, 0, 0, 0)), .Names = c("ID", "Income"), row.names = c(1L, 2L, 3L, 4L), class = "data.frame")))

> mylist 
$`1`
  ID Income
1 36      0
2 37      0
3 38      0
4 39   9100

$`2`
  ID Income
1 36      0
2 37      0
3 38      0
4 39      0

$`3`
  ID Income
1 36   7360
2 37      0
3 38      0
4 39      0

这就是我想做的:

   ID   Income
34 36     7360
26 37        0
23 38        0
15 39     9100

我曾尝试使用 reduce() 进行求和,但它创建了一个我想避免的单独列:

Reduce(function(df1, df2) data.frame(df1[,], res=df1["Income"] + df2["Income"]),mylist)

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    为什么要在数据框列表中执行 rbind 然后聚合?

    system.time(teste <- do.call("rbind",mylist))
    #   user  system elapsed 
    #  0.004   0.000   0.000 
    
    system.time(r1 <- Reduce(function(...) merge(..., by = "ID"), mylist))
    #   user  system elapsed 
    #  0.004   0.000   0.002 
    aggregate(teste$Income, by=list(teste$ID), sum)
    #  Group.1    x
    #1      36 7360
    #2      37    0
    #3      38    0
    #4      39 9100
    

    【讨论】:

      【解决方案2】:

      如果不同list中的'ID'可以不同,我们merge使用Reduce的数据集,然后对除第一个输出之外的rowSums进行输出以创建'收入'列。

      r1 <- Reduce(function(...) merge(..., by = "ID"), mylist) 
      data.frame(r1[1], Income = rowSums(r1[-1]))
      #   ID Income
      #1 36   7360
      #2 37      0
      #3 38      0
      #4 39   9100
      

      如果list 中所有数据集的“ID”相同且顺序相同,我们通过从“mylist”的第一个元素中提取“ID”来创建data.frame 并获得总和使用Reduce+ 计算“收入”。

      data.frame(mylist[[1]][1], Reduce(`+`, lapply(mylist, `[`, 'Income')))
      

      【讨论】:

      • 感谢这两个解决方案。只是想弄清楚它是如何工作的。
      • @AndroidBeginner 在第一个解决方案中,我们通过“ID”进行合并以创建单个数据集,然后对 2:ncol(r1) 中的列执行 rowSums。对于第二个解决方案,Reduce(+`` 是对 mylist 中每个对应值的元素求和
      猜你喜欢
      • 2016-01-27
      • 2014-10-24
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多