如何将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 reshape
和 tidyr
来做到这一点,但我有一个非常大的数据集,要求 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]))
我有一个 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 reshape
和 tidyr
来做到这一点,但我有一个非常大的数据集,要求 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]))