使用模式融合和转换数据表

时间:2016-01-27 21:18:09

标签: r data.table

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_3a_4b_3b_4已被编入索引1和{{1 }}。根据变量名称的后缀,我想要的是2列包含variable

我显然可以使用3,3,3,4,4,4meltstrsplit这种“老式”方式,但这有点麻烦。我希望一个单线解决方案仍然非常快。

2 个答案:

答案 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