R:当维度超过 2 时 reshape 数据框

标签 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 中确实非常高效。

你有什么想法吗?

谢谢你!

最佳答案

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

关于R:当维度超过 2 时 reshape 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48082107/

相关文章:

r - Shiny 应用程序无法读取包 : The application failed to start (exited with code 1)

r - knitr:添加到新代码块中的上一个绘图

python - 在 Python 中对稀疏数据集进行过采样

python-3.x - 如何按照我要求的方式取消旋转或堆叠 pandas 数据框?

python - 根据时差和 Pandas 数据框中列的条件创建一个新的数据框

python - reshape Pandas 数据框

python - pandas 内的 np reshape 应用

r - 在 Shiny 的应用程序和多个页面中进行身份验证

c++ - 了解 Rcpp 插件

reshape 数据框以在列中创建唯一值列表