r - R中面板数据框的结构 - 由单独的数据框组成
问题描述
我有一个长面板数据格式的相对较大的数据框。
然而。我需要把这个变小。基本上它是 10 个调查折叠的结构,这意味着相同的问题(变量)被重复,因此给了我 10 个测量相同事物的变量,但只有一年。
结构是这样的:
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),
pasta_2012 = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
burger_2012 = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
pizza_2012 = c(2, 2, 2, 1, 1, 1, 1, 1, 1),
pasta_2013 = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
burger_2013 = c(3, 3, 3, 2, 2, 2, 1, 1, 1),
pizza_2013 = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
pasta_2014 = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
burger_2014 = c(3, 3, 3, 2, 2, 2, 1, 1, 1),
pizza_2014 = c(1, 1, 1, 2, 2, 2, 3, 3, 3))
> print(y)
id year pasta_2012 burger_2012 pizza_2012 pasta_2013 burger_2013 pizza_2013 pasta_2014 burger_2014 pizza_2014
1 1 2012 1 1 2 1 3 1 1 3 1
2 1 2013 1 1 2 1 3 1 1 3 1
3 1 2014 1 1 2 1 3 1 1 3 1
4 2 2012 2 2 1 2 2 2 2 2 2
5 2 2013 2 2 1 2 2 2 2 2 2
6 2 2014 2 2 1 2 2 2 2 2 2
7 3 2012 3 3 1 3 1 3 3 1 3
8 3 2013 3 3 1 3 1 3 3 1 3
9 3 2014 3 3 1 3 1 3 3 1 3
我想要的是添加三个变量,然后删除其他变量,这样我只有一个用于披萨、意大利面和汉堡,并且每年都对应于它们在给定年份的值。像这样的东西:
id year pasta burger pizza
1 1 2012 1 1 2
2 1 2013 1 3 1
3 1 2014 1 3 1
4 2 2012 2 2 1
5 2 2013 2 2 2
6 2 2014 2 2 2
7 3 2012 3 3 1
8 3 2013 3 1 3
9 3 2014 3 1 3
有谁知道如何解决这个问题?我有超过 15 个变量*10,我需要在其中进行跟踪。
解决方案
使用pivot_longer
我们可以获得长格式的数据,并在数据中只保留唯一的行。
library(dplyr)
library(tidyr)
y %>%
pivot_longer(cols = -c(id, year),
names_to = c('.value', 'new_year'),
names_sep = '_') %>%
select(-year) %>%
distinct()
# id new_year pasta burger pizza
# <dbl> <chr> <dbl> <dbl> <dbl>
#1 1 2012 1 1 2
#2 1 2013 1 3 1
#3 1 2014 1 3 1
#4 2 2012 2 2 1
#5 2 2013 2 2 2
#6 2 2014 2 2 2
#7 3 2012 3 3 1
#8 3 2013 3 1 3
#9 3 2014 3 1 3