R:当超过 2 个维度时重塑数据框

R: reshape a data frame when more than 2 dimensions

我正在尝试将一个数据框转换为另一个数据框,请参见下面的示例:

> start = data.frame(Aa = c('A','A','A','A','a','a','a','a'),Bb = c('B','B','b','b','B','B','b','b'),Cc = c('C','c','C','c','C','c','C','c'),v=c(1,2,3,4,5,6,7,8))
> start
  Aa Bb Cc v
1  A  B  C 1
2  A  B  c 2
3  A  b  C 3
4  A  b  c 4
5  a  B  C 5
6  a  B  c 6
7  a  b  C 7
8  a  b  c 8

我想要一个像这样的数据框:

1  A  B  3
2  A  b  7
3  a  B  11
4  a  b  15
5  B  C  6
6  B  c  8
7  b  C  10
8  b  c  12
9  A  C  4
10  A  c  6
11  a  C  12
12  a  c  14

计算第 1 行是因为我们有 A-B-C -> 1 和 A-B-c -> 2 所以 A-B -> 3

事实是,我可以想象一个在列上使用一些 for 循环的解决方案,但我需要它来节省时间,我可以有 100,000 行和最多 100 列,所以我需要快速的东西,但我不不认为 for 循环在 R 中真的很有效。

你有什么想法吗?

谢谢!

也许您可以在列名上使用 combn

在这里,我使用 data.table 是为了它的高效聚合,也是为了方便 rbindlist 将数据重新组合在一起。

library(data.table)
setDT(start)

rbindlist(combn(names(start)[1:3], 2, FUN = function(x) {
  start[, sum(v), x]
}, simplify = FALSE))
#     Aa Bb V1
#  1:  A  B  3
#  2:  A  b  7
#  3:  a  B 11
#  4:  a  b 15
#  5:  A  C  4
#  6:  A  c  6
#  7:  a  C 12
#  8:  a  c 14
#  9:  B  C  6
# 10:  B  c  8
# 11:  b  C 10
# 12:  b  c 12