重组面板数据框
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
我有一个具有以下面板结构的数据框。但是,我想更改结构,因此列将折叠并对应于给定年份的测量值。
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