重组面板数据框

Restructure a panel dataframe

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

    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

有人可以帮我吗?

谢谢!

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

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 

我们可以使用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