我想从数据框列表中生成一个数据框,其中所有列都相同,除了一列'收入'这应该是所有'收入'的总和。在列表中。
这是我的数据框列表
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)
答案 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