首页 > 解决方案 > 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,我需要在其中进行跟踪。

标签: rdataframestructurepanel

解决方案


使用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

推荐阅读