我喜欢用
tidyverse
逻辑来估算分组面板数据中的变量。故事是这样的:这是调查数据,人们在特定年份(时间)被问及过去几年的行为。因此,我假设当有人说“我有 5 年的汽车”时,那些年的汽车变量可以设置为 1。那些年没有问这个问题。这是最少的数据和我想要实现的归因。
paneldata = data.frame(id=c(rep(1,10),rep(2,10)),
time=seq(1:10),
car=c(1,NA,NA,NA,NA,0,NA,NA,NA,1,1,NA,NA,NA,1,NA,NA,NA,NA,1),
car_imp_goal=c(1,NA,NA,NA,NA,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1))
paneldata
这是我试过的
paneldata <- paneldata %>% mutate(car_imp_trial = car)
paneldata %>% group_by(id) %>% fill(car_imp_trial , .direction = "up")
# A tibble: 20 × 5
# Groups: id [2]
id time car car_imp_goal car_imp_trial
<dbl> <int> <dbl> <dbl> <dbl>
1 1 1 1 1 1
2 1 2 NA NA 0
3 1 3 NA NA 0
4 1 4 NA NA 0
5 1 5 NA NA 0
6 1 6 0 0 0
7 1 7 NA 1 1
8 1 8 NA 1 1
9 1 9 NA 1 1
10 1 10 1 1 1
11 2 1 1 1 1
12 2 2 NA 1 1
13 2 3 NA 1 1
14 2 4 NA 1 1
15 2 5 1 1 1
16 2 6 NA 1 1
17 2 7 NA 1 1
18 2 8 NA 1 1
19 2 9 NA 1 1
20 2 10 1 1 1
过去的行为问题只在特定年份被问到(例如时间 5 和 10)。我需要
group_by(id)
然后使用ifelse
条件来选择相关时间,即5或10然后正在考虑使用fill
。 car_imp_trial
错的是从第6年开始填0,不是粘贴的行为题
创建一个时间间隔id,然后向上填充car栏
paneldata%>%
group_by(id,id2 = cut_interval(time, length = 5,labels =FALSE))%>%
fill(car, .direction = 'up')
# A tibble: 20 × 5
# Groups: id, id2 [4]
id time car car_imp id2
<dbl> <int> <dbl> <dbl> <int>
1 1 1 1 1 1
2 1 2 NA NA 1
3 1 3 NA NA 1
4 1 4 NA NA 1
5 1 5 NA NA 1
6 1 6 0 0 2
7 1 7 1 1 2
8 1 8 1 1 2
9 1 9 1 1 2
10 1 10 1 1 2
11 2 1 1 1 1
12 2 2 1 1 1
13 2 3 1 1 1
14 2 4 1 1 1
15 2 5 1 1 1
16 2 6 1 1 2
17 2 7 1 1 2
18 2 8 1 1 2
19 2 9 1 1 2
20 2 10 1 1 2