基于列表(未知长度)数据框中唯一名称的元素总和

时间:2018-02-08 20:13:48

标签: r

我正在尝试根据sum中包含未知数量list的唯一名称来获取dataframes个元素。

## Test Data
Name1 <- c("A","B","C","D")
Name2 <- c("A","D")
Name3 <- c("B","C","F")
Values1 <- c(1,2,3,4)
Values2 <- c(5,7)
Values3 <- c(6,8,9)
DF1 <- data.frame(Name1,Values1,stringsAsFactors = FALSE)
DF2 <- data.frame(Name2,Values2,stringsAsFactors = FALSE)
DF3 <- data.frame(Name3,Values3,stringsAsFactors = FALSE)

DFList <- list(DF1,DF2,DF3)

我的输出将是:

A  B  C  D  F 
6  8 11 11  9 

我不确定使用循环是否有效,因为列表中可以有任意数量的数据帧,并且数据框中唯一行的数量可以介于100,000到1百万之间。

3 个答案:

答案 0 :(得分:4)

使用data.table::rbindlist的解决方案:

data.table::rbindlist(DFList)[, sum(Values1), Name1]
   Name1 V1
1:     A  6
2:     B  8
3:     C 11
4:     D 11
5:     F  9

rbindlist绑定列尽管名称相同,然后您可以sum(Values1) Name1。{/ p>

答案 1 :(得分:3)

sapply(split(unlist(lapply(DFList, "[[", 2)), unlist(lapply(DFList, "[[", 1))), sum)
# A  B  C  D  F 
# 6  8 11 11  9 

OR

aggregate(formula = Value~Name,
          data = do.call(rbind, lapply(DFList, function(x) setNames(x, c("Name", "Value")))),
          FUN = sum)
#  Name Value
#1    A     6
#2    B     8
#3    C    11
#4    D    11
#5    F     9

答案 2 :(得分:2)

与@ d.b的答案类似。

lst <- unlist(lapply(DFList, function(DF) setNames(DF[[2]], DF[[1]])))
tapply(lst, names(lst), sum)
#A  B  C  D  F 
#6  8 11 11  9