【问题标题】:dplyr recast - variable not found [duplicate]dplyr recast - 找不到变量[重复]
【发布时间】:2015-07-14 01:08:55
【问题描述】:

首先,这是我正在使用的数据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 上(用简洁的措辞)。 经过一些(...)迭代后,我发现了一种有效的语法:

> 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

【问题讨论】:

  • 回复:你的第三个问题,我认为tidyr 没有。在tidyr 中执行此操作需要为您要传播的每个变量单独调用spread(在您的示例中为两个,但在您的实际数据中听起来更多),然后组合结果。根据Hadley's tidy data paper的说法,你的数据已经很整齐了,这可能是不支持这种操作的原因。
  • @SamFirke:你是对的,数据确实已经很整洁了。我现在需要做的是最后一步,我必须在其中生成可以注入 XLS 电子表格的(凌乱的)输出

标签: r dplyr reshape2 tidyr


【解决方案1】:

您可以尝试data.tabledevel 版本,它可以占用多个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 Rreshape

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.varmeasure.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

【讨论】:

    猜你喜欢
    • 2016-12-03
    • 1970-01-01
    • 2016-01-21
    • 2019-10-14
    • 2020-10-16
    • 2021-10-22
    • 2015-01-03
    • 2016-01-31
    • 2020-10-16
    相关资源
    最近更新 更多