arrays - 如何在 R 中将数组转换为 data.table 并返回?

标签 arrays r data.table

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

编辑1: 抱歉,“正确”的意思是我得到一个仅包含一列的数据框,因此我不知道值源自原始数组中的哪个位置。 这个想法是将数组转换为平面表,这样更容易,例如使用维度作为因子绘制变量,或按因子聚合值。 DT2 仍然可以实现这一点吗?

编辑2: 另一件有用的事情是将 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])))

谢谢!

最佳答案

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

两种方法本质上返回相同的 data.table,但在第二种方法中使用 A=1B=2C=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), ]

关于arrays - 如何在 R 中将数组转换为 data.table 并返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51247677/

相关文章:

arrays - 无法在 TypeScript 中使用 forEach 更改 boolean 数组值

java - 添加新项目时Listview跳转到顶部

java - 如何在java中正确复制对象?

r - Cbind 两个数据,但使用 data.table 进行了一些修改

r - 如何导入data.table索引功能?

javascript - 展平和区分对象中的多个数组

r - 使用 R 将多个文件从多个文件夹复制到单个文件夹

r - 将 sf 对象列表转换为一个 sf

r - 按因子将相对频率添加到数据框中

r - 根据名称类型将 data.frame 的列加在一起