Arrays 如何在R和R中将数组转换为data.table?

Arrays 如何在R和R中将数组转换为data.table?,arrays,r,data.table,Arrays,R,Data.table,这是将数组转换为数据表的最简单方法吗 require(data.table) require(ggplot2) # this returns a data.table with both array's dimensions and values aaa <- array(rnorm(3*4*2), dim = c(3,4,2)) DT1 <- as.data.table(as.data.frame.table(aaa)) # the following does not wor

这是将数组转换为数据表的最简单方法吗

require(data.table)
require(ggplot2)

# this returns a data.table with both array's dimensions and values
aaa <- array(rnorm(3*4*2), dim = c(3,4,2))
DT1 <- as.data.table(as.data.frame.table(aaa))

# the following does not work properly, because it only returns the array values
DT2 <- as.data.table(aaa)


# plot values aggregated by 3rd array dim
ggplot(DT1, aes(Var1, Freq, fill = Var3)) + geom_boxplot()
# sum values by 2nd array dim
DT1[ , sum(Freq), Var2]
require(data.table)
需要(ggplot2)
#这将返回一个包含数组维度和值的data.table

aaa取决于您所需的输出(因为您正在尝试将多维转换为“平面”表格),以下是使用plyr软件包的可能解决方案:

plyr的adply接受一个数组,并重新运行一个data.frame,您可以轻松地将其转换为data.table

library(plyr)
dt <- setDT( adply( aaa, c(1,2) ) )

    X1 X2         V1          V2
 1:  1  1 -0.5869804  1.30996405
 2:  2  1  1.3398003  1.87641841
 3:  3  1 -0.3268114 -0.12771971
 4:  1  2  0.8966523 -1.38669407
 5:  2  2 -0.4612773 -1.48036434
 6:  3  2 -0.6798351 -0.09369933
 7:  1  3  0.1311092  0.40458169
 8:  2  3 -1.7098850  0.39616792
 9:  3  3 -0.4589561 -1.14020015
10:  1  4  0.5348955 -0.25779528
11:  2  4  0.7099319  0.19067120
12:  3  4 -0.1545822 -0.75378610
库(plyr)

dt仅适用于版本1.11.4和1.11.2,但不适用于某些早期版本


这两种方法基本上都返回相同的data.table,但在第二种方法中使用
A=1
B=2
C=3
,并且行以不同的方式排序。因此,第二种方法是要走的路

DT2 <- as.data.table(aaa)
head(DT2)
#   V1 V2 V3       value
#1:  1  1  1  0.32337516
#2:  1  1  2  1.59189589
#3:  1  2  1 -1.48751756
#4:  1  2  2 -0.86749305
#5:  1  3  1  0.01017255
#6:  1  3  2  2.66571093

#compare
DT[order(Freq), ]
#and 
DT2[order(value), ]
DT2
将data.table转换回原始数组

这里有一个快速而肮脏的解决方案

DT2 = as.data.table(aaa)
aaa2= array(dim = dim(aaa))
invisible(DT2[, aaa2[V1, V2, V3] <<- value, .(V1,V2,V3)])
all.equal(aaa,aaa2) # TRUE
DT2=as.data.table(aaa)
aaa2=阵列(尺寸=尺寸(aaa))

不可见(DT2[,aaa2[V1,V2,V3]这两种方法基本上返回相同的
数据。table
但在第二种方法中使用
A=1
B=2
C=3
,以及以不同方式排序的行。因此,第二种方法更简洁地定义“正确的”
res=setDT(melt(aaa))
?注意:@Frank不幸地,
setDT(熔化(aaa))
现在不建议使用。它返回以下内容:
警告:data.table中的melt泛型已传递一个矩阵,并将尝试重定向到相关的REGRAPE2方法;请注意,REGRAPE2已被弃用,并且此重定向现在也已弃用。在两个库都处于运行状态时,继续使用REGRAPE2中的melt方法附加的名称空间,例如melt.list,您可以在名称空间前面加上Reforme2::melt(cropera.ls.32[[“cftarea32”]])。在下一个版本中,此警告将成为错误。
另请参见抱歉,它似乎对我不起作用。我看不到“value”的位置来自。DT2似乎只有一列名为aaa。为了更好地解释,我编辑了这篇文章。谢谢。@Sarah check
head(DT2)
value
是转换中创建的列之一。my
DT2
是一个有四列的数据表!您的代码对我也不起作用,fwiw。正如OP所说的表1.10.4-3它在我的两台机器上都适用于1.11.4和1.11.2版本,因此我只能假设
as.data.table在早期版本中的行为不同感谢@Wimpel指向setDT!它在内存使用方面似乎有很大的优势(没有复制)与data.table和dplyr函数相比,.Plyr是非常古老和缓慢的。就连Hadley(同时编写Plyr和dplyr的开发人员)也表示,dplyr打算继承Plyr。Frank的评论data.table答案是一种更好、更快的方法。
DT2 = as.data.table(aaa)
aaa2= array(dim = dim(aaa))
invisible(DT2[, aaa2[V1, V2, V3] <<- value, .(V1,V2,V3)])
all.equal(aaa,aaa2) # TRUE