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

时间:2018-01-03 17:17:48

标签: r dataframe reshape melt dcast

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

> 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中非常有效。

你有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

也许你可以在列名上使用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