减少宽格式数据中 ID 变量数量的规范方法
Canonical way to reduce number of ID variables in wide-format data
我有两个 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
的每个值(我我对列顺序不挑剔), 使以下 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
我有两个 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
的每个值(我我对列顺序不挑剔), 使以下 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