这是将数组转换为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 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]
EDIT1: 抱歉,“正确”是指我只得到一列的数据帧,因此我不知道值从原始数组的哪个位置产生。 这个想法是将数组转换为平面表,这样更容易例如使用维度作为因子绘制变量,或按因子汇总值。 DT2仍然可行吗?
EDIT2: 另一有用的事情是将data.table转换回原始数组。您是否知道通过定义将哪些列用作维来将data.table强制转换为数组的函数?
aaa <- array(rnorm(3*4*2), dim = c(3,4,2), list(Var1 = LETTERS[1:3], Var2 = LETTERS[1:4], Var3 = LETTERS[1:2] ))
DT1 <- setDT(melt(aaa))
# convert DT1 back to aaa
array(data = DT1[ ,value],
dim = c(length(unique(DT1[ ,Var1])),
length(unique(DT1[ ,Var2])),
length(unique(DT1[ ,Var3]))),
dimnames = list(Var1 = unique(DT1[ ,Var1]),
Var2 = unique(DT1[ ,Var2]),
Var3 = unique(DT1[ ,Var3])))
谢谢!
答案 0 :(得分:1)
仅适用于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), ]
答案 1 :(得分:0)
根据所需的输出(因为您正尝试将多维数据转换为“平面”表),因此可以使用plyr-package解决方案:
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
答案 2 :(得分:0)
将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