首页 > 解决方案 > 在 R 中创建一个面板数据框 - 其中一个变量中的值随时间变化

问题描述

使用以下数据:

id <- c(10420,10740, 12060,12060, 12060)
year <- c(2004, 2002, 2003, 2003, 2006)
y <- c(1,1,1,1,1)
data <- data.frame(id, year, y)
data



 id year y
1 10420 2004 1
2 10740 2002 1
3 12060 2003 1
4 12060 2003 1
5 12060 2006 1

我想创建一个具有以下结构的面板数据:

datapasta::tribble_paste(paneldata)     
  
 tibble::tribble(
~year,   ~id,    ~y,
 2002, 10420,      0,
 2003, 10420,      0,
 2004, 10420,      1,
 2005, 10420,      1,
 2006, 10420,      1,
 2007, 10420,      1,
 2002, 10740,      1,
 2003, 10740,      1,
 2004, 10740,      1,
 2005, 10740,      1,
 2006, 10740,      1,
 2007, 10740,      1,
 2002, 12060,      0,
 2003, 12060,      2,
 2004, 12060,      2,
 2005, 12060,      2,
 2006, 12060,      3,
 2007, 12060,      3
)

我尝试按照代码创建上面的面板数据集。

g <- with(data, expand.grid(year = seq(2002,2007), id= unique(id),y=0)) 
data2 <- rbind(data, g)  
data3 <-aggregate(y ~ year + id, data2, sum)[c("id", "year", "y")]

但是,上面的代码不会创建面板数据,就好像没有执行以下操作一样:对于特定的 id 和年份,如果存在新的观察值,变量 y 中的值应该改变。例如,id 为 12060 的 y 的值在 2002 年将为零,然后在 2003 年和 2005 年将更改为值 2,然后在 2006 年至 2007 年更改为值 3。

任何和所有的想法将不胜感激。

标签: rpanel

解决方案


我们通过获取整个数据的to + 1 of 'year'的影响来扩展行complete(在按'id'分组之后),并在按'id'分组后获得'y'的累积总和seqminmax

library(dplyr)
library(tidyr)   
data %>% 
    group_by(id, year) %>% 
    mutate(y = cumsum(y)) %>% 
    group_by(id) %>% 
    filter(!duplicated(year, fromLast = TRUE)) %>% 
    complete(year = min(.$year):(max(.$year) + 1), fill = list(y = 0)) %>% 
    mutate(y = cumsum(y))
# A tibble: 18 x 3
# Groups:   id [3]
#      id  year     y
#   <dbl> <dbl> <dbl>
# 1 10420  2002     0
# 2 10420  2003     0
# 3 10420  2004     1
# 4 10420  2005     1
# 5 10420  2006     1
# 6 10420  2007     1
# 7 10740  2002     1
# 8 10740  2003     1
# 9 10740  2004     1
#10 10740  2005     1
#11 10740  2006     1
#12 10740  2007     1
#13 12060  2002     0
#14 12060  2003     2
#15 12060  2004     2
#16 12060  2005     2
#17 12060  2006     3
#18 12060  2007     3

推荐阅读