data.table
包将melt
数据的新功能同时添加到多个列中。这非常有用,但我无法弄清楚如何保留预熔融变量名称的“后缀”。例如:
library(data.table)
# create data table
dt <- data.table(id = seq(3), a_3 = seq(3), a_4 = seq(4, 6), b_3 = seq(7, 9), b_4 = seq(10, 12))
# melt and cast in one step using new feature
m1 <- melt(dt, id.vars='id', measure=patterns("a_", "b_"), value.name=c("a_", "b_"))
数据表中的结果:
id variable a_ b_
1: 1 1 1 7
2: 2 1 2 8
3: 3 1 3 9
4: 1 2 4 10
5: 2 2 5 11
6: 3 2 6 12
这是我想要的“形状”,但变量a_3
,a_4
,b_3
和b_4
已被编入索引1
和{{1 }}。根据变量名称的后缀,我想要的是2
列包含variable
。
我显然可以使用3,3,3,4,4,4
,melt
,strsplit
这种“老式”方式,但这有点麻烦。我希望一个单线解决方案仍然非常快。
答案 0 :(得分:4)
我们可以使用splitstackshape
执行此操作。它给出了&#39; .time_1&#39;列自动
library(splitstackshape)
merged.stack(dt, var.stubs=c("a", "b"), sep="_")
# id .time_1 a b
#1: 1 3 1 7
#2: 1 4 4 10
#3: 2 3 2 8
#4: 2 4 5 11
#5: 3 3 3 9
#6: 3 4 6 12
答案 1 :(得分:2)
为什么不呢:
> m1[ , variable:= c(3,4)[variable] ]
> m1
id variable a_ b_
1: 1 3 1 7
2: 2 3 2 8
3: 3 3 3 9
4: 1 4 4 10
5: 2 4 5 11
6: 3 4 6 12