Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dplyr重播-未找到变量_R_Dplyr_Reshape2_Tidyr - Fatal编程技术网

dplyr重播-未找到变量

dplyr重播-未找到变量,r,dplyr,reshape2,tidyr,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 201

首先,以下是我使用的数据
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
我想(用tidyr的措辞)将年份变量分布在
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
为什么呢?从
重铸
的人那里,我假设它将把
度量.var
作为所有其他变量

2)那么,有没有办法避免指定
measure.var
?在我的实际情况中,有太多的变量,名称太长,无法显式指定它们


3)是否有更好/更简单的方法使用我缺少的
restrape2
tidyr
来实现这一点

您可以尝试
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
或者使用
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
。因此,如果您没有在
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

Re:你的第三个问题,我认为在
tidyr
中没有。在
tidyr
中执行此操作需要为每个要传播的变量单独调用
spread
(在示例中为两个,但在实际数据中听起来更像),然后组合结果。根据,您的数据已经是整洁的,这可能就是为什么不支持这种操作的原因。@SamFirke:您是对的,数据确实已经是整洁的。我现在需要做的是最后一步,在这一步中,我必须生成(混乱的)输出,这些输出可以注入到XLS电子表格中