R:如何使用正则表达式对列表元素进行分组和聚合?

时间:2015-11-20 22:43:45

标签: regex r list grouping aggregate

我想按组聚集(总结)以下产品清单(见下文):

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)

但是,我没有找到如何在聚合函数中实现以前的产品编号。想法?谢谢

1 个答案:

答案 0 :(得分:1)

这是两种方法。任何一个都没有使用任何包。

1)使用列表从列为产品(S列)和关联组({{1}的组中创建两列data.frame value }专栏)。创建要拆分的列表ind。在生成By的代码中,By提取产品,然后sub("\\.*", "", names(prods))用于查找关联的组。 match提取年份。接下来执行拆分并对其进行lapply以运行求和。如果需要,sub("\\..*", "", names(prods))Bygroup)的两个组成部分可以反转以更改输出的顺序。

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)