如何将data.table融成人年得到年份后缀作为变量列?

How to melt with data.table into person years getting year suffix as variable column?

我有一个 data.table 看起来像:

      PID  vara90  vara91  vara92 vara93 varb90  varb91  varb92 varb93
1:    1    2       1       45     77     "Str1"  "Str3"  "Str3" "Str1"
2:    2    6       1       5      3      "Str2"  "Str5"  "Str4" "Str1"
3:    3    1       1       56     65     "Str3"  "Str2"  "Str6" "Str1"
4:    4    8       1       45     9      "Str1"  "Str8"  "Str3" "Str2"
5:    5    12      3       45     44     "Str4"  "Str1"  "Str8" "Str3"
6:    6    2       6       78     1      "Str5"  "Str3"  "Str1" "Str4"
7:    7    2       3       45     23     "Str2"  "Str1"  "Str3" "Str1"
8:    8    2       1       44     87     "Str1"  "Str3"  "Str1" "Str4"

并希望将其转换为具有以下形状的长格式:

      PID  year  vara      varb
1:    1    90       2       "Str1"  
2:    1    91       1       "Str3"
3:    1    92       45      "Str3"
.
.
.

我正在使用:

melt(df, id.vars("PID", measure=patterns("^vara","^varb"), value.name=c("vara","varb"),variable.name="year)

这让我得到了我想要的,除了 year 列由 1 到 3 之间的数字填充。有没有办法从变量名称中获取由年份后缀填充的年份列?我可以使用 base reshapetidyr 来做到这一点,但我有一个非常大的数据集,要求 data.table.

的内存效率

您似乎想将两列(var 和 year)从宽格式合并为长格式。 var 和 year 信息组合在每个列名中。 对于这些类型的任务,我通常执行 gather %>% separate %>% spread 的组合。

解决了你关于按实际年份(而不是索引号)融化的问题,但我不知道它是否具有 data.table.

的性能效率

separate(..., sep)参数可以是正则表达式或整数字符串位置。

library(tidyr)
df1 <- gather(data=df, key=var.yr, value=temporaryValue, -PID)
df1 <- separate(data=df1, col=var.yr, into=c("var", "yr"), sep=4)
df1 <- spread(data=df1, key=var, value=temporaryValue)

head(df1)
#  PID yr vara varb
#1   1 90    2 Str1
#2   1 91    1 Str3
#3   1 92   45 Str3
#4   1 93   77 Str1
#5   2 90    6 Str2
#6   2 91    1 Str5

在实现 Frank 链接的 FR 之前,我们必须手动设置级别(variable col 是 factor):

ans = melt(dt, measure = patterns("^vara", "^varb"),
              value.name = c("vara", "varb"), variable.name = "year")
setattr(ans$year, 'levels', gsub("vara", "", names(dt)[2:5]))