【问题标题】:Panel data, from wide to long with multiple variables [duplicate]面板数据,从宽到长,具有多个变量[重复]
【发布时间】:2019-02-20 19:06:36
【问题描述】:

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

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 苦苦挣扎

【问题讨论】:

    标签: r dplyr reshape tidyr


    【解决方案1】:

    你需要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 年 2 月 20 日创建

    【讨论】:

      【解决方案2】:

      看来您可以通过组合使用 spreadgather 包中的 tidyverse 函数来解决您的问题。

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

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

      首先:按年份和值收集,创建一个名为“measurement”的新列

      > 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
      

      第二:通过你的新“变量”和“测量”传播

      > dat_2 <- dat_1 %>% spread(key="variable",value="measurement")
      > dat_2
        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
      

      我真诚地希望这能解决您的问题。

      【讨论】:

      • 这是一个技术问题,但spreadgather 都在tidyr 中,这是tidyverse 安装和加载的软件包之一
      • 另外,这或多或少与@CalumYou 的回答相同
      • @camille 没错,我们可能同时回答了这个问题,因为这个问题很新鲜(也许我花了更多时间以更有教育意义的方式输入答案)。您对包裹的看法也是正确的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-27
      相关资源
      最近更新 更多