首页 > 解决方案 > 重构面板数据框

问题描述

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

    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

有人能帮我一下吗?

谢谢!

标签: rdataframepanel

解决方案


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

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 

推荐阅读