3

这是将数组转换为 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])))

谢谢!

4

3 回答 3

4

仅适用于 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), ]
于 2018-07-09T14:30:07.490 回答
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
于 2018-07-09T14:25:42.450 回答
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
于 2019-07-23T08:18:15.390 回答