在 R 中创建面板数据框 - 其中一个变量中的值随时间变化

Create a panel data frame in R - where one of the values within a variable changes through time

使用以下数据:

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。

如有任何想法,我们将不胜感激。

我们通过将 minsequence 扩展为 max + 1,用 complete 扩展行(按 'id' 分组后) 'year' 的整个数据,并在按 'id'

分组后得到 'y' 的累计和
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

在 base R 中,使用 expand.grid 你可以:

#Create all combinations of `id` and `year`
g <- with(data, expand.grid(id= unique(id), year = seq(2002,2007))) 
#Merge `g` with `data`
data2 <- merge(g, data, all.x = TRUE)
#Replace NA with 0
data2$y[is.na(data2$y)] <- 0
#Increment the value by 1 for each `y` value by `id`.
data2$y <- with(data2, ave(y, id, FUN = cumsum))