分组面板数据框并创建变量

时间:2019-07-05 11:09:18

标签: r

我正在使用调查数据,因此无法进行以下练习。我的数据框看起来像这样。

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

基本上,我有家庭(家庭身份)和个人(成员身份)标识符,以及一个附加变量,即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

因此,我想创建一个变量“结果”,该变量可以跟踪成员id和memberidprev之间是否存在“移位”,即使在发生移位之后的后续期间,也不仅在此之后的时期内发生转变。

例如,在Year = 2011中,memberid = 2对应于2010年中的memberid = 1。因此,只要在2010年至2014年之间有member = 2,我的变量结果就应该具有result = 1。发生这种情况是因为memberid = 2和memberid = 3在memberidprev中不存在,这意味着它们在上次采访中没有出现(年= 2013)。因此,我希望变量结果为它们创建新的标识符(分别为12和13)。

我希望我已经足够清楚了。 谁能帮我这个?非常感谢大家。

1 个答案:

答案 0 :(得分:1)

使用for循环解决此问题的一种方法

#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")