面板数据,从宽到长,有多个变量

时间:2019-02-20 19:06:37

标签: r dplyr reshape tidyr

我正在努力处理具有多个变量的长格式的大型面板数据。看起来像这样

set.seed(42)

    dat_0=
      data.frame(
      c(rep('AFG',2),rep('UK',2)),
      c(rep(c('GDP','pop'),2)),
      runif(4),
      runif(4))
    colnames(dat_0)<-c('country','variable','2010','2011')

产生这样的数据帧:

  country variable        2010      2011
1     AFG      GDP 0.535761290 0.7515226
2     AFG      pop 0.002272966 0.4527316
3      UK      GDP 0.608937453 0.5357900
4      UK      pop 0.836801559 0.5373767

我正在尝试/努力将其强制为这种结构

    country   year        GDP      pop
1     AFG     2010 0.5357612   0.0022729
2     AFG     2011 0.7515226   0.4527316
3      UK     2010 0.6089374   0.8368015
4      UK     2011 0.5357900   0.5373767

很抱歉,如果我重复一遍,我似乎在为reshape / tidyr / dplyr而苦苦挣扎

2 个答案:

答案 0 :(得分:0)

您需要先gather,然后再spread

library(tidyverse)
set.seed(42)

dat_0 <- data.frame(c(rep("AFG", 2), rep("UK", 2)), c(rep(c("GDP", "pop"), 2)), runif(4), runif(4))
colnames(dat_0) <- c("country", "variable", "2010", "2011")

dat_0 %>%
  gather(year, value, `2010`, `2011`) %>%
  spread(variable, value)
#>   country year       GDP       pop
#> 1     AFG 2010 0.9148060 0.9370754
#> 2     AFG 2011 0.6417455 0.5190959
#> 3      UK 2010 0.2861395 0.8304476
#> 4      UK 2011 0.7365883 0.1346666

reprex package(v0.2.1)于2019-02-20创建

答案 1 :(得分:0)

看起来您可以将if (flag == O_SOMETHING) {...}包中的spreadgather函数混合使用来解决问题。

编辑:实际上,该软件包是tidyverse,它是tidyr软件包的一部分

您可以分两个步骤解决此问题。

第一:按年份和值进行收集,创建一个名为“测量”的新列

tidyverse

第二:通过新的“变量”和“度量”进行传播

> dat_1 <- dat_0 %>% gather(key="year",value="measurement","2010":"2011")
> dat_1
  country variable year measurement
1     AFG      GDP 2010   0.9148060
2     AFG      pop 2010   0.9370754
3      UK      GDP 2010   0.2861395
4      UK      pop 2010   0.8304476
5     AFG      GDP 2011   0.6417455
6     AFG      pop 2011   0.5190959
7      UK      GDP 2011   0.7365883
8      UK      pop 2011   0.1346666

我衷心希望这能解决您的问题。