группирование панели данных и создание переменной - PullRequest
1 голос
/ 05 июля 2019

Я работаю с данными опроса, и мне не удается выполнить следующее упражнение. Мой фрейм данных выглядит следующим образом.

familyid memberid memberidprev panelid Year
100      1        NA           1       2010
100      2        NA           1       2010
100      2        1            2       2011
100      1        2            2       2011
100      2        2            3       2012
100      1        1            3       2012
100      2        2            4       2013
100      1        1            4       2013
100      1        1            5       2014
100      2        NA           5       2014
100      3        NA           5       2014
100      1        2            6       2015  
100      2        3            6       2015

где в основном у меня есть семейные (familyid) и индивидуальные (memberid) идентификаторы, а также дополнительная переменная, т.е. memberidprev, которая сообщает мне, который был идентификатором того же члена семьи в предыдущем интервью.

То, что я не в состоянии сделать, - это создать новую переменную, которая позволит мне иметь правильный идентификатор для каждого члена домохозяйства в каждый момент времени. Другими словами, я хотел бы получить что-то вроде этого

familyid memberid memberidprev panelid Year    result
100      1        NA           1       2010     1
100      2        NA           1       2010     2
100      2        1            2       2011     1
100      1        2            2       2011     2
100      2        2            3       2012     1
100      1        1            3       2012     2
100      2        2            4       2013     1
100      1        1            4       2013     2
100      1        1            5       2014     2
100      2        NA           5       2014     12
100      3        NA           5       2014     13
100      1        2            6       2015     12
100      2        3            6       2015     13
100      3        1            6       2015     2

Поэтому я хотел бы создать переменную «result», которая отслеживает, есть ли «сдвиг» между memberid и memberidprev даже в течение периода наблюдения после того, как произошел сдвиг, а не только в период сразу после сдвиг происходит.

Например, в Year = 2011, memberid = 2 соответствует memberid = 1 в Year 2010. Поэтому мой переменный результат должен иметь результат = 1, когда есть member = 2 в период между 2010 и 2014 годами. Вместо этого в 2014 году будет другой сдвиг происходит, так как memberid = 2 и memberid = 3 представляют NA в memberidprev, что означает, что они не присутствовали в предыдущем интервью (Год = 2013). По этой причине я хотел бы, чтобы моя переменная result создала для них новые идентификаторы (12 и 13 соответственно).

Я надеюсь, что я был достаточно ясен .. Кто-нибудь может мне с этим помочь? Большое спасибо всем вам.

1 Ответ

1 голос
/ 10 июля 2019

Один способ решить эту проблему, используя for loop

#Initialize the identifier and result 
df$result <- 0
identifier <- 0

#For every row in df
for (i in  seq_len(nrow(df))) {
    #Check if the shift occurs (NA in current memberidprev)
    if (is.na(df$memberidprev[i])) {
       #Create a new identifier
       identifier = identifier + 1
       df$result[i] <- identifier
    }
   else {
     #If there is no shift get result from previous Year and memberid
     df$result[i] <- df$result[df$memberid == df$memberidprev[i] & 
                              (df$Year[i] - 1) == df$Year]
   }
}

df
#   familyid memberid memberidprev panelid Year result
#1       100        1           NA       1 2010      1
#2       100        2           NA       1 2010      2
#3       100        2            1       2 2011      1
#4       100        1            2       2 2011      2
#5       100        2            2       3 2012      1
#6       100        1            1       3 2012      2
#7       100        2            2       4 2013      1
#8       100        1            1       4 2013      2
#9       100        1            1       5 2014      2
#10      100        2           NA       5 2014      3
#11      100        3           NA       5 2014      4
#12      100        1            2       6 2015      3
#13      100        2            3       6 2015      4
#14      100        3            1       6 2015      2

Данные

df <- structure(list(familyid = c(100L, 100L, 100L, 100L, 100L, 100L, 
100L, 100L, 100L, 100L, 100L, 100L, 100L, 100L), memberid = c(1L, 
2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 3L, 1L, 2L, 3L), memberidprev = c(NA, 
NA, 1L, 2L, 2L, 1L, 2L, 1L, 1L, NA, NA, 2L, 3L, 1L), panelid = c(1L, 
1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 5L, 6L, 6L, 6L), Year = c(2010L, 
2010L, 2011L, 2011L, 2012L, 2012L, 2013L, 2013L, 2014L, 2014L, 
2014L, 2015L, 2015L, 2015L)), row.names = c(NA, -14L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...