我有一个多维数组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))
我问这个问题是因为
- 我的解决方案感觉有些重复,因为我使用了
melt
,然后是cast
并指定了d1,d2,d3
两次。我想知道是否有更直接的做事方式。 - 如果有一个不需要加载额外包的至少同样紧凑的解决方案,那将是一件好事。
所以重申一下,我会对以下任何一项感到满意:
- 需要
reshape2
的更直接的解决方案 - 不需要
reshape2
的更直接的解决方案 - 一个至少不需要
reshape2
的紧凑型解决方案
最佳答案
我假设您不会只是复制和粘贴代码,而是共享一组可能是 source
d 的脚本,或者甚至创建一个函数包。
记住这一点,您可以轻松地重新创建我在评论中提到的函数。
这是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/