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 checkhead(DT2)
,value
是转换中创建的列之一。myDT2
是一个有四列的数据表!您的代码对我也不起作用,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