在 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。
如有任何想法,我们将不胜感激。
我们通过将 min
的 seq
uence 扩展为 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))
使用以下数据:
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。
如有任何想法,我们将不胜感激。
我们通过将 min
的 seq
uence 扩展为 max
+ 1,用 complete
扩展行(按 'id' 分组后) 'year' 的整个数据,并在按 'id'
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))