减少宽格式数据中 ID 变量数量的规范方法

Canonical way to reduce number of ID variables in wide-format data

我有两个 ID 变量组织的数据,YearCountry,像这样:

Year Country VarA VarB
2015     USA    1    3
2016     USA    2    2
2014  Canada    0   10
2015  Canada    6    5
2016  Canada    7    8

我想将 Year 保留为 ID 变量,但为 VarAVarB 创建多个列,每个列对应 Country 的每个值(我我对列顺序不挑剔), 使以下 table:

Year VarA.Canada VarA.USA VarB.Canada VarB.USA
2014           0       NA          10       NA
2015           6        1           5        3
2016           7        2           8        2

我设法用以下代码做到了这一点:

require(data.table)
require(reshape2)

data <- as.data.table(read.table(header=TRUE, text='Year Country VarA VarB
2015     USA    1    3
2016     USA    2    2
2014  Canada    0   10
2015  Canada    6    5
2016  Canada    7    8'))

molten <- melt(data, id.vars=c('Year', 'Country'))
molten[,variable:=paste(variable, Country, sep='.')]
recast <- dcast(molten, Year ~ variable)

但这似乎有点老套(尤其是编辑默认命名的 variable 字段)。我可以用更少的函数调用来完成吗?理想情况下,我可以只调用一个函数,指定要删除的列作为 ID 和创建新变量名称的公式。

使用 dcast 您可以一次施放多个 value.var(从 data.table v1.9.6 开始)。尝试:

dcast(data, Year ~ Country, value.var = c("VarA","VarB"), sep = ".")

#   Year VarA.Canada VarA.USA VarB.Canada VarB.USA
#1: 2014           0       NA          10       NA
#2: 2015           6        1           5        3
#3: 2016           7        2           8        2