首页 > 解决方案 > 如何替换第一个事件中缺失的观测值的缺失值?

问题描述

我在面板数据中输入了一个社会阶层变量。我想用第一波出现的第一个社会等级替换所有社会等级变量。但是,有些人在第一波中丢失了数据。我还想估算这些人的社会等级,但仅在社会等级变量第一次出现之后。如果我使用以下命令:

df %>% 
  group_by(id) %>%
  dplyr::mutate(class_imputed = first(class))

# Groups:   id [4]
      id  wave  year class class_imputed
   <dbl> <dbl> <dbl> <fct> <fct>        
 1     1     1  2007 3     3            
 2     1     2  2008 2     3            
 3     1     3  2009 2     3            
 4     1     4  2010 2     3            
 5     2     1  2005 .     .            
 6     2     2  2006 2     .            
 7     2     3  2007 3     .            
 8     2     4  2008 .     .            
 9     3     1  2007 .     .            
10     3     2  2008 .     .            
11     3     3  2009 1     .            
12     3     4  2010 1     .            
13     4     1  2009 2     2            
14     4     2  2010 .     2            
15     4     3  2011 3     2            
16     4     4  2012 .     2    

我们可以看到 ID 为 2 和 3 的人没有被估算。但我只想估算第一次观察到社会阶层变量的时期。这意味着 ID 号为 2 的人只会在 2006 年、2007 年和 2008 年获得社会等级 = 2,但在 2005 年不会。有人可以帮忙吗?

这是数据:

structure(list(id = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 
4, 4, 4), wave = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 
3, 4), year = c(2007, 2008, 2009, 2010, 2005, 2006, 2007, 2008, 
2007, 2008, 2009, 2010, 2009, 2010, 2011, 2012), class = structure(c(4L, 
3L, 3L, 3L, 1L, 3L, 4L, 1L, 1L, 1L, 2L, 2L, 3L, 1L, 4L, 1L), .Label = c(".", 
"1", "2", "3"), class = "factor"), class_imputed = structure(c(3L, 
3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c(".", 
"2", "3"), class = "factor")), row.names = c(NA, -16L), class = "data.frame")
 

标签: rdplyrpanel-data

解决方案


你可以试试这个选项 -

library(dplyr)

df %>%
  group_by(id) %>%
  dplyr::mutate(class_imputed = replace(class, 
                      row_number() > match(TRUE, class != '.'), 
                      class[class != '.'][1]))

#     id  wave  year class class_imputed
#   <dbl> <dbl> <dbl> <fct> <fct>        
# 1     1     1  2007 3     3            
# 2     1     2  2008 2     3            
# 3     1     3  2009 2     3            
# 4     1     4  2010 2     3            
# 5     2     1  2005 .     .            
# 6     2     2  2006 2     2            
# 7     2     3  2007 3     2            
# 8     2     4  2008 .     2            
# 9     3     1  2007 .     .            
#10     3     2  2008 .     .            
#11     3     3  2009 1     1            
#12     3     4  2010 1     1            
#13     4     1  2009 2     2            
#14     4     2  2010 .     2            
#15     4     3  2011 3     2            
#16     4     4  2012 .     2     

match(TRUE, class != '.')将返回值不是的第一个位置,'.'并将class[class != '.'][1]返回要估算的值,即第一个社会阶层变量。


推荐阅读