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
我正在尝试将一个数据框转换为另一个数据框,请参见下面的示例:
> 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