R 熔化时保留变量级别的名称

R 熔化时保留变量级别的名称,r,data.table,reshape,melt,R,Data.table,Reshape,Melt,有没有办法保留正在融化的原始变量级别的名称?例如,在下面的示例中,是否有任何方法可以获得“alpha”、“beta”和“gamma”,而不是“1”、“2”、“3” 当然,我可以重命名它们,但是我使用的数据集有大量的级别,因此重命名它们将非常耗时且容易出错 谢谢 库(data.table) #>警告:包“data.table”是在R版本3.4.2下生成的 种子集(2334) #定义数据帧 df“数据帧”:10 obs。共有7个变量: #>$a_alpha:num-0.1181.237 0.809-

有没有办法保留正在融化的原始变量级别的名称?例如,在下面的示例中,是否有任何方法可以获得“alpha”、“beta”和“gamma”,而不是“1”、“2”、“3”

当然,我可以重命名它们,但是我使用的数据集有大量的级别,因此重命名它们将非常耗时且容易出错

谢谢

库(data.table)
#>警告:包“data.table”是在R版本3.4.2下生成的
种子集(2334)
#定义数据帧
df“数据帧”:10 obs。共有7个变量:
#>$a_alpha:num-0.1181.237 0.809-0.766-0.592。。。
#>$a_beta:num 0.0019 1.0639 2.336 0.9056 0.6449。。。
#>$a_伽马:数值0.5485 0.8345-0.5977 0.0827 0.2754。。。
#>$b_alpha:num 0.209-0.305 0.434-0.362 0.412。。。
#>$b_beta:num-1.6404 2.8382 0.0661 0.7249-0.4421。。。
#>$b_gamma:num-0.1440.964-0.763-1.356 0.995。。。
#>$id:num1 2 3 4 5 6 7 8 9 10
#转换为长格式
df_长类“data.table”和“data.frame”:30 obs。共有4个变量:
#>$id:num1 2 3 4 5 6 7 8 9 10。。。
#>$项目:系数w/3级“1”、“2”、“3”:1。。。
#>$a:num-0.1181.2370.809-0.766-0.592。。。
#>$b:数值0.209-0.305 0.434-0.362 0.412。。。
#>-attr(*,“.internal.selfref”)=
#项目结构
级别(df_long$项目)
#> [1] "1" "2" "3"
#问题:如何将“项目”因子级别设置为“α”“β”“γ”,而不是“1”“2”“3”

由(v0.1.1.9000)于2018年1月12日创建。

我过去处理此问题的方法是在
融化数据后使用
因子。但是,您可能需要进行一些检查,以确保数据和级别的顺序正确

下面是一个例子:

set.seed(2334)
df <- data.table(a_alpha = rnorm(10), a_beta = rnorm(10), a_gamma = rnorm(10),
                 b_alpha = rnorm(10), b_beta = rnorm(10), b_gamma = rnorm(10), 
                 id = c(1:10))
df_mess <- copy(df)
setcolorder(df_mess, c(1, 7, 6, 4, 2, 5, 3))
names(df_mess)
# [1] "b_alpha" "id"      "a_alpha" "a_beta"  "b_beta"  "b_gamma" "a_gamma"

stubs <- c("^a_", "^b_")
## assumes all stubs have same number of cols. Easy to modify
labs <- grep(stubs[1], names(df_mess), value = TRUE) 
labs <- gsub(paste(stubs, collapse = "|"), "", labs[order(labs)])

out1 <- melt(df, measure.vars = patterns(stubs), value.name = c("a", "b"), 
             variable.name = "item")[
               , item := factor(item, labels = labs)][]

out2a <- melt(df_mess, measure.vars = patterns(stubs), value.name = c("a", "b"), 
              variable.name = "item")[
                , item := factor(item, labels = labs)][]

out2b <- melt(setcolorder(df_mess, names(df_mess)[order(names(df_mess))]),
     measure.vars = patterns(stubs), value.name = c("a", "b"), 
     variable.name = "item")[
       , item := factor(item, labels = labs)][]

library(compare)
compare(out1, out2a)
# FALSE [TRUE, TRUE, TRUE, FALSE]
compare(out1, out2b)
# TRUE
set.seed(2334)

df我不确定您认为
数据在哪里。表
将从中获取
“alpha”“beta”“gamma”
字符串,因为它们在原始表中不存在(以那种形式)。请看一看,以获得一些启示。您基本上必须使用
因子
匹配
或类似的东西。我认为这是两个包如何找到列的结果
data.table
grep
过于灵活,无法可靠地提取所需的列名部分(尽管它在您的情况下可以工作)。而
sep
版本可以隐式地发送到
strsplit
,以根据需要断开字符串。吝啬使灵活性丧失了。@Henrik非常感谢您!!!这对我完全有效:)@indrajeetpail请注意,我已经更新了。从
data.table 1.14.1
,新函数
measure
保留串联变量名的原始字符串。