在 R 中按条件插补分组数据中的值

Impute values in grouped data by condition in R

提问人:Marco 提问时间:2/28/2023 最后编辑:Marco 更新时间:2/28/2023 访问量:27

问:

我喜欢用逻辑插补分组面板数据中的变量。故事是这样的:它是调查数据,人们被要求在特定年份(时间)了解过去几年的行为。因此,我假设当有人说“我有一辆车 5 年”时,这些年的汽车变量可以设置为 1。在那些年里没有问过这个问题。这是最小的数据,也是我喜欢实现的插补。tidyverse

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)被问到。然后我需要使用条件来选择相关时间,即 5 或 10 然后正在考虑使用 .问题在于,它从 6 年级开始就填满了 0,这不是一个粘贴的行为问题。group_by(id)ifelsefillcar_imp_trial

r tidyverse 数据操作

评论

0赞 Onyambu 2/28/2023
你想要什么结果?列?car_imp
0赞 Marco 2/28/2023
谢谢你的问题。我进行了相应的编辑。
0赞 Onyambu 2/28/2023
你怎么知道它的 5 年?4年?等等,还是只是当我们看到 0 时?
0赞 Marco 2/28/2023
正好是时间 5 和 10。两者之间可能还有更多值。而且有些时间点完全缺失。虽然时间 5 的答案在过去 5 年中是正确的,但有时我只有 2 年(有差距)。
0赞 Onyambu 2/28/2023
Id 1 在时间 5 没有答案。他们在时间 6 和 10 有答案。时间 7 应该等于 0 吗?

答:

1赞 Onyambu 2/28/2023 #1

创建时间间隔 ID,然后向上填充汽车列

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