对数据帧列表中的列求和

时间:2016-06-30 03:25:44

标签: r dataframe

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

这是我的数据框列表

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)

2 个答案:

答案 0 :(得分:3)

如果不同list中的ID不同,我们会使用merge Reduce数据集,然后执行rowSums的{​​{1}}输出除了第一个创建收入'列。

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

如果&#39; ID&#39;对于list中的所有数据集,它们是相同且相同的顺序,我们通过提取&#39; ID&#39;来创建data.frame。来自“mylist”的第一个元素&#39;并获得收入的总和&#39;将Reduce+一起使用。

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

答案 1 :(得分:0)

为什么不在数据框列表中进行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