заполнение пропущенного значения из отстающего значения в R - PullRequest
1 голос
/ 18 октября 2019

У меня есть такой фрейм данных:

ID     year  mstat change lint
8049    1995    1   NA    NA
8049    1996    1   0     1994
8049    1997    1   NA    NA
8049    1998    1   0     1996
8049    1999    1   NA    NA
8049    2000    1   0     1998
8049    2001    1   NA      NA
8049    2002    1   0     2000
8049    2003    NA  NA    NA
8049    2004    NA  NA    NA
8049    2005    NA  NA    NA
8049    2006    NA  NA    NA
8049    2007    NA  NA    NA
8049    2008    1   0     2002
8049    2009    NA  NA    NA
8049    2010    1   0     2008
8049    2011    NA  NA    NA
8049    2012    2   1     2008
8049    2013    NA  NA    NA
  1. mstat = семейное положение,

  2. lint = дата последнего интервью

  3. изменение = изменение семейного положения

Для конкретного лица, последняя дата интервью в year=2008 составляет 2002. а изменение семейного положения в year=2008 составляет 0. Это означает, что семейное положение с 2003 по 2007 годы должно совпадать с семейным положением в 2002 или в 2008 году. Как я могу заполнить mstat с 2003 по 2007, используя 2002/2008 mstat для этого человека, а также для всегонабор данных в R? (Для разных людей пропущенные значения даны в разные годы.)

Мой желаемый результат (в столбце mstat_updated с 2003 по 2007 год равен 1.)

 ID   year mstat change lint mstat_updated
8049   2000 1   0       1998    1
8049   2001 1   NA      NA      1
8049   2002 1   0       2000    1
8049   2003 NA  NA      2002    1
8049   2004 NA  NA     2002     1
8049   2005 NA  NA      2002    1
8049   2006 NA  NA      2002    1
8049   2007 NA  NA      2002    1
8049   2008 1   0       2002    1
8049   2009 NA  NA      2008    1
8049   2010 1   0       2008    1
8049   2011 NA  NA      2010    NA
8049   2012 2   1       2010    2

Послепробуя код, предложенный Беном, я получаю следующую таблицу, где все значения change равны TRUE.

df %>%
  fill(lint, .direction = 'up') %>%
  group_by(lint) %>%
  mutate(anychange = any(change > 0),
         mstat_updated = ifelse(anychange, mstat, last(mstat)))




ID    year  mstat change lint anychange mstat_updated
8049    1992    1   1   1991    TRUE    1
8049    1993    1   0   1992    TRUE    1
8049    1994    1   0   1993    TRUE    1
8049    1995    NA  NA  1994    TRUE    NA
8049    1996    1   0   1994    TRUE    1
8049    1997    NA  NA  1996    TRUE    NA
8049    1998    1   0   1996    TRUE    1
8049    1999    NA  NA  1998    TRUE    NA
8049    2000    1   0   1998    TRUE    1
8049    2001    NA  NA  2000    TRUE    NA
8049    2002    1   0   2000    TRUE    1
8049    2003    NA  NA  2002    TRUE    NA
8049    2004    NA  NA  2002    TRUE    NA
8049    2005    NA  NA  2002    TRUE    NA
8049    2006    NA  NA  2002    TRUE    NA
8049    2007    NA  NA  2002    TRUE    NA
8049    2008    1   0   2002    TRUE    1
8049    2009    NA  NA  2008    TRUE    NA
8049    2010    1   0   2008    TRUE    1
8049    2011    NA  NA  2008    TRUE    NA
8049    2012    2   1   2008    TRUE    2
8049    2013    NA  NA  2012    TRUE    NA
8049    2014    3   1   2012    TRUE    3
8049    2015    NA  NA  2014    TRUE    NA
8049    2016    3   0   2014    TRUE    3


 head(df,20L)
       ID    year  mstat change  lint anychange mstat_updated
   <fct>    <fct>  <int>  <int>  <dbl> <lgl>     <int>
 1 8049  1993      1      0  1992        TRUE      1
 2 8049  1994      1      0  1993        TRUE      1
 3 8049  1995     NA     NA  1994        TRUE      NA
 4 8049  1996      1      0  1994        TRUE      1
 5 8049  1997     NA     NA  1996        TRUE     NA
 6 8049  1998      1      0  1996        TRUE      1
 7 8049  1999     NA     NA  1998        TRUE     NA
 8 8049  2000      1      0  1998        TRUE      1
 9 8049  2001     NA     NA  2000        TRUE      NA
10 8049  2002      1      0  2000        TRUE      1
11 8049  2003     NA     NA  2002        TRUE      NA
12 8049  2004     NA     NA  2002        TRUE      NA
13 8049  2005     NA     NA  2002        TRUE      NA
14 8049  2006     NA     NA  2002        TRUE      NA
15 8049  2007     NA     NA  2002        TRUE      NA
16 8049  2008      1      0  2002        TRUE       1
17 8049  2009     NA     NA  2008        TRUE       NA
18 8049  2010      1      0  2008        TRUE       1
19 8049  2011     NA     NA  2008        TRUE       NA
20 8049  2012      2      1  2008        TRUE       2


dput() gives the following structure

  structure(list(ID = structure(c(4143L, 4143L, 4143L, 4143L, 4143L, 
   4143L, 4143L, 4143L, 4143L, 4143L), .Label = c("1", "2", "3", 
  .............
structure(15:24, .Label = c("1979", 
"1980", "1981", "1982", "1983", "1984", "1985", "1986", "1987", 
"1988", "1989", "1990", "1991", "1992", "1993", "1994", "1995", 
"1996", "1997", "1998", "1999", "2000", "2001", "2002", "2003", 
"2004", "2005", "2006", "2007", "2008", "2009", "2010", "2011", 
"2012", "2013", "2014", "2015", "2016"), class = "factor"), mstat = c(1L, 
1L, NA, 1L, NA, 1L, NA, 1L, NA, 1L), change = c(0L, 0L, NA, 0L, 
 NA, 0L, NA, 0L, NA, 0L), lint = c(1992, 1993, 1994, 1994, 1996, 
 1996, 1998, 1998, 2000, 2000), anychange = c(TRUE, TRUE, TRUE, 
 TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE), mstat_updated = c(1L, 
 1L, NA, 1L, NA, 1L, NA, 1L, NA, 1L)), class = c("tbl_df", "tbl", 
 "data.frame"), row.names = c(NA, -10L))

Итак, после того, как Бен выполнил абсолютно полезные рекомендации, я наконец-то получил то, что хотел.

Во-первых, я исправлял линты год за годом (возможно, они неэффективны, но в любом случае работали нормально), где линты были неверными в данных (например, как указал Бен за данные за 2012 год - последнее интервью за 2008 год,но были данные за 2010 год, которые были более свежими). Мои примеры кодов:

df$lint_up<-ifelse(df$year==2012 & df$lint==2008 & lag(df$lint,2)==2008, 2010, df$lint)

 df$lint_up<-ifelse(df$year==2004  & df$lint==2000 & lag(df$lint,2)==2000, 2002, df$lint)

 df$lint_up<-ifelse(df$year==2000  & df$lint==1996 & lag(df$lint,2)==1996, 1998, df$lint)

Затем я заполняю переменную lint_updated (lint_up):

mk<-df%>%
  group_by(ID)%>%
  fill(lint_up,.direction = 'up')

Теперь, для mstat_updated, я следовал в основном совету Бена, но яgroup_by ID и lint_up:

abc<-mk %>%
  group_by(lint_up, ID) %>%
  mutate(mstat_updated = ifelse(is.na(mstat) & any(last(change==0)), 
  last(mstat), mstat))

1 Ответ

0 голосов
/ 18 октября 2019

Отредактировано 10/19/19 :

Спасибо за добавление дополнительной информации. Я надеюсь, что это ближе.

Один tidyverse подход заключается в использовании значений NA для последнего интервью lint лет. Используя .direction = 'up', вы будете заполнять данные на основе самых последних данных за год.

Затем group_by в прошлом году собеседования (lint) внесите изменения, основанные только на этих годах. Это позволило бы вам изменить годы 2003-2007 на основе 2008 mstat.

Еще одна проблема, которую я обнаружил, связана с данными за 2012 год - последнее интервью lint было проведено в 2008 году, но, похоже, были данные за 2010 годэто было более новым.

При последнем редактировании теперь будет выполняться следующее:

  • Фильтрация записей по данным
  • Создание новой переменной last_year_data - это похоже на lint, но поймает 2010, где есть данные, но lint пропущено
  • Это изменит NA на 0 в переменной change - это поймает any(change) для идентификациигде mstat_updated не следует обновлять

Я думаю, что это решит некоторые проблемы, но может затронуть другие. Если это не работает, я не против удалить мой ответ (в случае, если другие могут с большей вероятностью ответить), или вы можете попробовать опубликовать новый / пересмотренный вопрос.

library(dplyr)

df %>%
  filter(!is.na(mstat) & (mstat >= 0)) %>%
  mutate(last_year_data = lag(year)) %>%
  right_join(df) %>% 
  fill(last_year_data, .direction = 'up') %>%
  group_by(last_year_data) %>%
  mutate(mstat_updated = last(mstat),
         change = replace_na(change, 0)) %>%
  mutate(mstat_updated = ifelse(any(change > 0) & is.na(mstat), mstat, mstat_updated))

# A tibble: 34 x 7
# Groups:   last_year_data [20]
      ID  year mstat change  lint last_year_data mstat_updated
   <int> <int> <int>  <dbl> <int>          <int>         <int>
 1  8049  1983     0      0  1982           1983             0
 2  8049  1984     0      0  1983           1983             0
 3  8049  1985     0      0  1984           1984             0
 4  8049  1986     0      0  1985           1985             0
 5  8049  1987     0      0  1986           1986             0
 6  8049  1988     0      0  1987           1987             0
 7  8049  1989     0      0  1988           1988             0
 8  8049  1990     0      0  1989           1989             0
 9  8049  1991     0      0  1990           1990             0
10  8049  1992     1      1  1991           1991             1
11  8049  1993     1      0  1992           1992             1
12  8049  1994     1      0  1993           1993             1
13  8049  1995    NA      0  1994           1994             1
14  8049  1996     1      0  1994           1994             1
15  8049  1997    NA      0  1996           1996             1
16  8049  1998     1      0  1996           1996             1
17  8049  1999    NA      0  1998           1998             1
18  8049  2000     1      0  1998           1998             1
19  8049  2001    NA      0  2000           2000             1
20  8049  2002     1      0  2000           2000             1
21  8049  2003    NA      0  2002           2002             1
22  8049  2004    -5      0  2002           2002             1
23  8049  2005    NA      0  2002           2002             1
24  8049  2006    -5      0  2002           2002             1
25  8049  2007    NA      0  2002           2002             1
26  8049  2008     1      0  2002           2002             1
27  8049  2009    NA      0  2008           2008             1
28  8049  2010     1      0  2008           2008             1
29  8049  2011    NA      0  2008           2010            NA
30  8049  2012     2      1  2008           2010             2
31  8049  2013    NA      0  2012           2012            NA
32  8049  2014     3      1  2012           2012             3
33  8049  2015    NA      0  2014           2014             3
34  8049  2016     3      0  2014           2014             3
...