Arrays 融化数组并使数值成为字符

Arrays 融化数组并使数值成为字符,arrays,r,data.table,melt,Arrays,R,Data.table,Melt,我有一个数组,我想基于dimnames来融化它。问题是维度名称是大数值,因此将其设置为字符会将其转换为错误的ID请参见示例: test <- array(1:18, dim = c(3,3,2), dimnames = list(c(00901291282245454545454,329293929929292,2929992929922929), c("a", "b", "c"),

我有一个数组,我想基于dimnames来融化它。问题是维度名称是大数值,因此将其设置为字符会将其转换为错误的ID请参见示例:

test <- array(1:18, dim = c(3,3,2), dimnames = list(c(00901291282245454545454,329293929929292,2929992929922929),
                                                   c("a", "b", "c"),
                                                   c("d", "e")))

library(reshape2)
library(data.table)
test2 <- data.table(melt(test))
test2[, Var1 := as.character(Var1)]

> test2
Var1 Var2 Var3 value
1: 9.01291282245455e+20    a    d     1
2:      329293929929292    a    d     2
3:     2929992929922929    a    d     3
4: 9.01291282245455e+20    b    d     4
5:      329293929929292    b    d     5
6:     2929992929922929    b    d     6
7: 9.01291282245455e+20    c    d     7
8:      329293929929292    c    d     8
9:     2929992929922929    c    d     9
10: 9.01291282245455e+20    a    e    10
11:      329293929929292    a    e    11
12:     2929992929922929    a    e    12
13: 9.01291282245455e+20    b    e    13
14:      329293929929292    b    e    14
15:     2929992929922929    b    e    15
16: 9.01291282245455e+20    c    e    16
17:      329293929929292    c    e    17
18:     2929992929922929    c    e    18

test您需要将dimnames定义为
字符
,然后缓慢修改
melt.array
,当您对
数组
执行
melt
操作时会调用该数组:

test <- array(1:18, dim = c(3,3,2), dimnames = list(c("00901291282245454545454", "329293929929292", "2929992929922929"),
                                                    c("a", "b", "c"),
                                                    c("d", "e")))
在您的示例中尝试新函数(使用
conv=FALSE
):

编辑

reformae2
devtools::install_github(“hadley/reformate”)
的开发版本中,
melt.array
的定义不同,您可以按原样使用参数
以避免转换:

melt(test, as.is=TRUE)

将为您提供与上述相同的结果(使用
Var1
etc而不是
X1
etc)。

选项(scipen=99)将解决e+20问题如果是数字列,则开始处的0将被删除。我认为我们无法避免它。如果您是从csv文件等导入数据,则将此列本身指定为字符列以避免此问题
head(melt.array2(test, conv=FALSE))
                        # X1 X2 X3 value
# 1  00901291282245454545454  a  d     1
# 2          329293929929292  a  d     2
# 3         2929992929922929  a  d     3
# 4  00901291282245454545454  b  d     4
# 5          329293929929292  b  d     5
# 6         2929992929922929  b  d     6
melt(test, as.is=TRUE)