【问题标题】:Restructure a panel dataframe重构面板数据框
【发布时间】:2021-08-15 10:28:36
【问题描述】:

我有一个具有以下面板结构的数据框。但是,我想更改结构,因此列将折叠并对应于给定年份的测量值。

    y <- data.frame(id = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
                year = c(2012, 2013, 2014, 2012, 2013, 2014, 2012, 2013, 2014),
                P2012 = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
                P2013 = c(2, 2, 2, 1, 1, 1, 1, 1, 1),
                P2014 = c(3, 3, 3, 2, 2, 2, 1, 1, 1))

  id year P2012 P2013 P2014
1  1 2012     1     2     3
2  1 2013     1     2     3
3  1 2014     1     2     3
4  2 2012     2     1     2
5  2 2013     2     1     2
6  2 2014     2     1     2
7  3 2012     3     1     1
8  3 2013     3     1     1
9  3 2014     3     1     1

我想要的是我只得到一列,由其他三列的值组成。

  id year P2012 P2013 P2014 P
1  1 2012     1     2     3 1
2  1 2013     1     2     3 2
3  1 2014     1     2     3 3
4  2 2012     2     1     2 2
5  2 2013     2     1     2 1
6  2 2014     2     1     2 2
7  3 2012     3     1     1 3
8  3 2013     3     1     1 1
9  3 2014     3     1     1 1

谁能帮帮我?

谢谢!

【问题讨论】:

    标签: r dataframe panel


    【解决方案1】:

    我们可以使用tidyverse

    library(dplyr)
    library(stringr)
    y %>%
        rowwise %>% 
        mutate(P =  get(str_subset(names(y)[3:5], as.character(year)))) %>% 
        ungroup
    # A tibble: 9 x 6
         id  year P2012 P2013 P2014     P
      <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    1     1  2012     1     2     3     1
    2     1  2013     1     2     3     2
    3     1  2014     1     2     3     3
    4     2  2012     2     1     2     2
    5     2  2013     2     1     2     1
    6     2  2014     2     1     2     2
    7     3  2012     3     1     1     3
    8     3  2013     3     1     1     1
    9     3  2014     3     1     1     1
    

    【讨论】:

    • 所以现在的问题是,我有不止三列,我需要做同样的事情,它没有系统地放置在数据框中。可以说,所有列名末尾都包含“004”。知道如何做到这一点吗?
    • 非常抱歉。我如何接受答案?我以为我只是赞成它?我还没有真正弄清楚如何在这里做到这一点?真的不想冒犯任何人,我很高兴我在这里得到了很好的答案。
    • 我完全进去了。我只是不知道这里的规则。我已经接受了你给我的答案,因为它很有帮助并且做了它应该做的。
    • @R9413 关于您的新问题,您是说列名是P004、'Q004` 等,那么“年份”部分会是什么
    • 是的,完全正确 - 所以不是 P2021 Pxxx - 列名的所有共同点是名称末尾的“004”。但是,我希望代码提供 P 列,就像您提供给我的代码一样。
    【解决方案2】:

    您可以使用矩阵子集来提取每一年的对应值。

    y$P <- y[cbind(1:nrow(y), match(paste0('P', y$year), names(y)))]
    
    y
    #  id year P2012 P2013 P2014 P
    #1  1 2012     1     2     3 1
    #2  1 2013     1     2     3 2
    #3  1 2014     1     2     3 3
    #4  2 2012     2     1     2 2
    #5  2 2013     2     1     2 1
    #6  2 2014     2     1     2 2
    #7  3 2012     3     1     1 3
    #8  3 2013     3     1     1 1
    #9  3 2014     3     1     1 1 
    

    【讨论】:

    • 所以现在的问题是,我有不止三列,我需要做同样的事情,它没有系统地放置在数据框中。可以说,所有列名末尾都包含“004”。知道如何做到这一点吗?
    • 我认为如果您将其作为一个新问题提出会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    相关资源
    最近更新 更多