dplyr 重铸 - 未找到变量
dplyr recast - variable not found
首先,这是我正在使用的数据 tbl_df
(已简化):
> mytbldf
Source: local data frame [6 x 5]
iso2c country year var1 var2
1 BI Burundi 2011 4.486265 6.693711
2 BI Burundi 2012 3.939242 5.330326
3 BI Burundi 2013 4.286439 5.747370
4 UG Uganda 2011 3.998849 10.025680
5 UG Uganda 2012 4.606198 13.416311
6 UG Uganda 2013 4.746322 15.981362
我想在 var1
和 var2
上传播(用简洁的措辞)年份变量。
经过一些 (...) 迭代后,我找到了一个有效的语法:
> recast(mytbldf, iso2c + country ~ variable + year, measure.var = c("var1","var2"))
iso2c country var1_2011 var1_2012 var1_2013 var2_2011 var2_2012 var2_2013
1 BI Burundi 4.486265 3.939242 4.286439 6.693711 5.330326 5.74737
2 UG Uganda 3.998849 4.606198 4.746322 10.025680 13.416311 15.98136
三个问题:
1) 如果我不指定 measure.var =
,我会收到以下错误:
> recast(mytbldf, iso2c + country ~ variable + year)
Using iso2c, country as id variables
Error in eval(expr, envir, enclos) : object 'year' not found
这是为什么?从 recast
的人那里,我假设它将 measure.var
作为所有其他变量?
2) 那么,有没有办法避免指定measure.var
?在我的真实情况下,有太多名称太长的变量,无法明确指定它们。
3) 是否有一种 better/simpler 方法可以使用我缺少的 reshape2
或 tidyr
来做到这一点?
您可以尝试 data.table
的 devel
版本,它可以包含多个 value.var
列
library(data.table)#v1.9.5+
dcast(setDT(mytbldf), iso2c+country~year, value.var=c('var1', 'var2'))
# iso2c country 2011_var1 2012_var1 2013_var1 2011_var2 2012_var2 2013_var2
#1: BI Burundi 4.486265 3.939242 4.286439 6.693711 5.330326 5.74737
#2: UG Uganda 3.998849 4.606198 4.746322 10.025680 13.416311 15.98136
或使用 base R
中的 reshape
reshape(mytbldf, idvar=c('iso2c', 'country'), timevar='year',
direction='wide')
# iso2c country var1.2011 var2.2011 var1.2012 var2.2012 var1.2013 var2.2013
#1 BI Burundi 4.486265 6.693711 3.939242 5.330326 4.286439 5.74737
#4 UG Uganda 3.998849 10.025680 4.606198 13.416311 4.746322 15.98136
关于recast
,就是melt
+ dcast
。因此,如果您未在 melt
中指定 id.var
或 measure.var
,则 long
格式将与您预期的不同。对于 recast
,您可以将 id.var
指定为
library(reshape2)
recast(mytbldf, id.var=c('iso2c', 'country', 'year'),
iso2c+country~variable+year)
# iso2c country var1_2011 var1_2012 var1_2013 var2_2011 var2_2012 var2_2013
#1 BI Burundi 4.486265 3.939242 4.286439 6.693711 5.330326 5.74737
#2 UG Uganda 3.998849 4.606198 4.746322 10.025680 13.416311 15.98136
此外,如果您知道列索引,将比键入名称更容易,
recast(mytbldf, measure.var=4:5, iso2c+country~variable+year)
# iso2c country var1_2011 var1_2012 var1_2013 var2_2011 var2_2012 var2_2013
#1 BI Burundi 4.486265 3.939242 4.286439 6.693711 5.330326 5.74737
#2 UG Uganda 3.998849 4.606198 4.746322 10.025680 13.416311 15.98136
首先,这是我正在使用的数据 tbl_df
(已简化):
> mytbldf
Source: local data frame [6 x 5]
iso2c country year var1 var2
1 BI Burundi 2011 4.486265 6.693711
2 BI Burundi 2012 3.939242 5.330326
3 BI Burundi 2013 4.286439 5.747370
4 UG Uganda 2011 3.998849 10.025680
5 UG Uganda 2012 4.606198 13.416311
6 UG Uganda 2013 4.746322 15.981362
我想在 var1
和 var2
上传播(用简洁的措辞)年份变量。
经过一些 (...) 迭代后,我找到了一个有效的语法:
> recast(mytbldf, iso2c + country ~ variable + year, measure.var = c("var1","var2"))
iso2c country var1_2011 var1_2012 var1_2013 var2_2011 var2_2012 var2_2013
1 BI Burundi 4.486265 3.939242 4.286439 6.693711 5.330326 5.74737
2 UG Uganda 3.998849 4.606198 4.746322 10.025680 13.416311 15.98136
三个问题:
1) 如果我不指定 measure.var =
,我会收到以下错误:
> recast(mytbldf, iso2c + country ~ variable + year)
Using iso2c, country as id variables
Error in eval(expr, envir, enclos) : object 'year' not found
这是为什么?从 recast
的人那里,我假设它将 measure.var
作为所有其他变量?
2) 那么,有没有办法避免指定measure.var
?在我的真实情况下,有太多名称太长的变量,无法明确指定它们。
3) 是否有一种 better/simpler 方法可以使用我缺少的 reshape2
或 tidyr
来做到这一点?
您可以尝试 data.table
的 devel
版本,它可以包含多个 value.var
列
library(data.table)#v1.9.5+
dcast(setDT(mytbldf), iso2c+country~year, value.var=c('var1', 'var2'))
# iso2c country 2011_var1 2012_var1 2013_var1 2011_var2 2012_var2 2013_var2
#1: BI Burundi 4.486265 3.939242 4.286439 6.693711 5.330326 5.74737
#2: UG Uganda 3.998849 4.606198 4.746322 10.025680 13.416311 15.98136
或使用 base R
reshape
reshape(mytbldf, idvar=c('iso2c', 'country'), timevar='year',
direction='wide')
# iso2c country var1.2011 var2.2011 var1.2012 var2.2012 var1.2013 var2.2013
#1 BI Burundi 4.486265 6.693711 3.939242 5.330326 4.286439 5.74737
#4 UG Uganda 3.998849 10.025680 4.606198 13.416311 4.746322 15.98136
关于recast
,就是melt
+ dcast
。因此,如果您未在 melt
中指定 id.var
或 measure.var
,则 long
格式将与您预期的不同。对于 recast
,您可以将 id.var
指定为
library(reshape2)
recast(mytbldf, id.var=c('iso2c', 'country', 'year'),
iso2c+country~variable+year)
# iso2c country var1_2011 var1_2012 var1_2013 var2_2011 var2_2012 var2_2013
#1 BI Burundi 4.486265 3.939242 4.286439 6.693711 5.330326 5.74737
#2 UG Uganda 3.998849 4.606198 4.746322 10.025680 13.416311 15.98136
此外,如果您知道列索引,将比键入名称更容易,
recast(mytbldf, measure.var=4:5, iso2c+country~variable+year)
# iso2c country var1_2011 var1_2012 var1_2013 var2_2011 var2_2012 var2_2013
#1 BI Burundi 4.486265 3.939242 4.286439 6.693711 5.330326 5.74737
#2 UG Uganda 3.998849 4.606198 4.746322 10.025680 13.416311 15.98136