我想按组聚集(总结)以下产品清单(见下文):
prods <- list("101.2000"=data.frame(1,2,3),
"102.2000"=data.frame(4,5,6),
"103.2000"=data.frame(7,8,9),
"104.2000"=data.frame(1,2,3),
"105.2000"=data.frame(4,5,6),
"106.2000"=data.frame(7,8,9),
"101.2001"=data.frame(1,2,3),
"102.2001"=data.frame(4,5,6),
"103.2001"=data.frame(7,8,9),
"104.2001"=data.frame(1,2,3),
"105.2001"=data.frame(4,5,6),
"106.2001"=data.frame(7,8,9))
test= list("100.2000"=data.frame(2,3,5),
"100.2001"=data.frame(4,5,6))
names <- c("A", "B", "C")
prods <- lapply(prods, function (x) {colnames(x) <- names; return(x)})
产品清单(prods)的每个元素都有产品编号和年份的名称组合(例如101.2000 - > 101 =产品编号和2000 =年)。这些组仅包含聚合的产品编号。
group1 <- c(101, 106)
group2 <- c(102, 104)
group3 <- c(105, 103)
我的预期结果显示按年汇总的产品组:
$group1.2000
A B C
1 8 10 12
$group2.2000
A B C
1 5 7 9
$group3.2000
A B C
1 11 13 15
$group1.2001
A B C
1 8 10 12
$group2.2001
A B C
1 5 7 9
$group3.2001
A B C
1 11 13 15
到目前为止,我尝试过这种方式:首先,我将prods
的名称分解为产品编号:
prodnames <- names(prods)
prodnames_sub <- gsub("\\..*.","", prodnames)
然后我尝试使用lapply聚合:
lapply(prods, function(x) aggregate( ... , FUN = sum)
但是,我没有找到如何在聚合函数中实现以前的产品编号。想法?谢谢
答案 0 :(得分:1)
这是两种方法。任何一个都没有使用任何包。
1)使用列表从列为产品(S
列)和关联组({{1}的组中创建两列data.frame value
}专栏)。创建要拆分的列表ind
。在生成By
的代码中,By
提取产品,然后sub("\\.*", "", names(prods))
用于查找关联的组。 match
提取年份。接下来执行拆分并对其进行lapply以运行求和。如果需要,sub("\\..*", "", names(prods))
(By
和group
)的两个组成部分可以反转以更改输出的顺序。
year
2)使用data.frames 将每个组和prods转换为数据框,合并它们,执行聚合并拆分回列表。除订单外,输出与请求的输出相同。 (反转聚合公式中的两个右手变量以获得问题中显示的顺序,但这也将反转输出列表中每个组件名称的两个部分。)
S <- stack(list(group1 = group1, group2 = group2, group3 = group3))
By <- list(group = S$ind[match(sub("\\..*", "", names(prods)), S$values)],
year = sub(".*\\.", "", names(prods)))
lapply(split(prods, By), function(x) colSums(do.call(rbind, x)))
,并提供:
S <- stack(list(group1 = group1, group2 = group2, group3 = group3))
DF0 <- do.call(rbind, prods)
DF <- cbind(do.call(rbind, strsplit(rownames(DF0), ".", fixed = TRUE)), DF0)
M <- merge(DF, S, all.x = TRUE, by = 1)
Ag <- aggregate(cbind(A, B, C) ~ ind + `2`, M, sum)
lapply(split(Ag, paste(Ag[[1]], Ag[[2]], sep = ".")), "[", 3:5)