2

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

> 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 行是因为我们有 ABC -> 1 和 ABc -> 2 所以 AB -> 3

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

你有什么想法?

谢谢!

4

1 回答 1

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
于 2018-01-03T17:30:52.637 回答