dplyr recast - 未找到变量

时间:2015-05-04 15:16:26

标签: r dplyr reshape2 tidyr

首先,这是我正在使用的数据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

我希望将年变量(var1var2传播(用tidyr措辞)。 经过一些(...)迭代后,我发现了一种有效的语法:

> 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)使用我遗漏的reshape2tidyr是否有更好/更简单的方法?

1 个答案:

答案 0 :(得分:5)

您可以尝试devel data.table版本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

reshape

或使用base R

中的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 + id.var。因此,如果您未在measure.var中指定meltlong,则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

此外,如果你知道列索引,那么比输入名称

更容易
workers