我正在尝试根据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百万之间。
答案 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