我的数据由两个ID变量Year
和Country
组织,如下所示:
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变量,但为VarA
和VarB
创建多个列,每个值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删除的列和创建新变量名的公式。
答案 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