我正在使用调查数据,因此无法进行以下练习。我的数据框看起来像这样。
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)。
我希望我已经足够清楚了。 谁能帮我这个?非常感谢大家。
答案 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")