我正在尝试将数据框转换为另一个,请参阅下面的示例:
> 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中非常有效。
你有什么想法吗?
谢谢!
答案 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