r - 具有多值变量的熔化数组

标签 r multidimensional-array reshape reshape2

我有一个多维数组a,我想把它格式化成out。我使用了 melt,然后是 dcast,但我想知道是否有更好的方法,不使用或不使用 library(reshape)

library(reshape2)
(a=array(1:3^4,c(3,3,3,3),dimnames=list("d1"=paste("d1",letters[1:3],sep="-"),
                                       "d2"=paste("d2",letters[1:3],sep="-"),
                                       "d3"=paste("d3",letters[1:3],sep="-"),
                                       "d4"=paste("d4",letters[1:3],sep="-"))))
(out=dcast(melt(a,id.vars=c("d1","d2","d3")),d1+d2+d3~d4))

我问这个问题是因为

  1. 我的解决方案感觉有些重复,因为我使用了 melt,然后是 cast 并指定了 d1,d2,d3 两次。我想知道是否有更直接的做事方式。
  2. 如果有一个不需要加载额外包的至少同样紧凑的解决方案,那将是一件好事。

所以重申一下,我会对以下任何一项感到满意:

  1. 需要 reshape2 的更直接的解决方案
  2. 不需要 reshape2 的更直接的解决方案
  3. 一个至少不需要 reshape2
  4. 的紧凑型解决方案

最佳答案

我假设您不会只是复制和粘贴代码,而是共享一组可能是 sourced 的脚本,或者甚至创建一个函数包。

记住这一点,您可以轻松地重新创建我在评论中提到的函数。

这是ftable(a):

ftable(a)
#                d4 d4-a d4-b d4-c
# d1   d2   d3                    
# d1-a d2-a d3-a       1   28   55
#           d3-b      10   37   64
#           d3-c      19   46   73
#      d2-b d3-a       4   31   58
#           d3-b      13   40   67
#           d3-c      22   49   76
#      d2-c ......................
# ................................

及其属性:

attributes(ftable(a))
# $dim
# [1] 27  3
# 
# $class
# [1] "ftable"
# 
# $row.vars
# $row.vars$d1
# [1] "d1-a" "d1-b" "d1-c"
# 
# $row.vars$d2
# [1] "d2-a" "d2-b" "d2-c"
# 
# $row.vars$d3
# [1] "d3-a" "d3-b" "d3-c"
# 
# 
# $col.vars
# $col.vars$d4
# [1] "d4-a" "d4-b" "d4-c"

您可以使用这些属性来创建如下所示的函数:

ftable2df <- function (mydata) {
  if (class(mydata) != "ftable") mydata <- ftable(mydata)
  dfrows <- rev(expand.grid(rev(attr(mydata, "row.vars"))))
  dfcols <- as.data.frame.matrix(mydata)
  names(dfcols) <- do.call(
    paste, c(rev(expand.grid(rev(attr(mydata, "col.vars")))), 
             sep = "_"))
  cbind(dfrows, dfcols)
}

ftable2df(a)
#      d1   d2   d3 d4-a d4-b d4-c
# 1  d1-a d2-a d3-a    1   28   55
# 2  d1-a d2-a d3-b   10   37   64
# 3  d1-a d2-a d3-c   19   46   73
# 4  d1-a d2-b d3-a    4   31   58
# 5  d1-a d2-b d3-b   13   40   67
# 6  d1-a d2-b d3-c   22   49   76
# 7  d1-a d2-c d3-a    7   34   61
# 8  d1-a d2-c d3-b   16   43   70
# 9  d1-a d2-c d3-c   25   52   79
# 10 d1-b d2-a d3-a    2   29   56
# 11 d1-b d2-a d3-b   11   38   65
# 12 d1-b d2-a d3-c   ............
# ................................

更新(非基础解决方案)

如果您没有与“reshape2”结婚并且愿意使用一个包,只要它在 CRAN 上,并且如果您愿意接受一个可能比 melt 慢一点的解决方案在处理和dcast处理您的数据时,您还可以从“plyr”查看adply

library(plyr)
adply(a, 1:3)

关于r - 具有多值变量的熔化数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27613805/

相关文章:

r - 按行名称合并多个数据帧

r - 将 R 中选定的列转置为行

r - 通过R中的方式组合具有重复ID的行

r - knitr 中 R 代码块和 LaTeX 的全局变量

r - 编码 R 中向量中元素的变化

c - 从C中的1D数组填充2D数组

php - 具有数组结构的字符串到数组

r - 如何根据一组不等式约束对 data.table 进行排序?

最近邻居(图论)的 Python 实现由于通过引用而不是值传递的多维数组而无法工作

以特定形式 reshape 数据