降低宽格式数据中ID变量数量的典型方法

时间:2017-05-04 17:37:16

标签: r data.table reshape reshape2

我的数据由两个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一个(我是对列顺序不挑剔),制作下表:

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)

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

1 个答案:

答案 0 :(得分:3)

使用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