LOCF的条件插补

时间:2019-12-10 21:37:59

标签: r dplyr na imputation locf

我有这个纵向数据的例子。我需要根据之前发生的情况估算0、999或-1值。

ID = c(1,1,1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,5,6,6,6,6,6,6,6,6) 
Oxy = c(0, 999, 1, 999, 999, 0, 0, 999, 999, 0, 0, -1, 0, 999, 1, 1, -1, 1, 999, -1, 0, -1, 1,0, 999, 0) 
Y = c(2010,2011,2012,2013,2014,2011,2012,2013,2010,2011,2012,2010,2011,
      2012,2010,2011,2012,2013,2014,2015,2016,2017, 2018,2019,2020, 2021) 
Oxy2 = c(0, 999, 1, 1, 1, 0, 0, 999, 999, 0, 0, -1, 0, 999, 1, 1, 1, 1, 999, -1, 0, -1, 1, 1,1,1) 
df = data.frame(ID, Oxy, Y, Oxy2)

基本上,我想从Oxy获取Oxy2。当Oxy的先前值为0或-1时,我需要保留999,并考虑到组ID随着时间的推移,替换所有其他内容,出现在第一个1之后。

ID Oxy    Y Oxy2
  1   0 2010    0
  1 999 2011  999
  1   1 2012    1
  1 999 2013    1
  1 999 2014    1
  2   0 2011    0
  2   0 2012    0
  2 999 2013  999
  3 999 2010  999
  3   0 2011    0
  3   0 2012    0
  4  -1 2010   -1
  4   0 2011    0
  4 999 2012  999
  5   1 2010    1
  5   1 2011    1
  5  -1 2012    1
  5   1 2013    1
  6 999 2014  999
  6  -1 2015   -1
  6   0 2016    0
  6  -1 2017   -1
  6   1 2018    1
  6   0 2019    1
  6 999 2020    1
  6   0 2021    1

感谢您的建议。

1 个答案:

答案 0 :(得分:1)

您可以使用LOAD DATA INFILE来确定哪些行在第一个1之后:

cumsum(Oxy == 1) >= 1

输出:

df %>%
  group_by(ID) %>%
  mutate(OxyFilled = ifelse(cumsum(Oxy == 1) >= 1, 1, Oxy))