[英]grouping panel dataframe and creating variable
我正在處理調查數據,但無法進行以下練習。 我的數據框看起來像這樣。
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
因此,我想創建一個變量“結果”,它跟蹤 memberid 和 memberidprev 之間是否存在“轉變”,即使是在轉變發生后的后續期間,而不僅僅是在轉變發生后的那個時期.
例如,在 Year=2011 中,memberid=2 對應於 2010 年的 memberid=1。因此,每當 2010 年和 2014 年之間有 member=2 時,我的變量結果應該有 result=1。相反,在 2014 年,發生了另一個轉變,因為memberid=2 和 memberid=3 在 memberidprev 中顯示 NA,這意味着它們在之前的采訪中沒有出現(Year=2013)。 出於這個原因,我希望我的變量結果為它們創建新的標識符(分別為 12 和 13)。
我希望我已經足夠清楚了..有人可以幫我嗎? 非常感謝你們所有人。
使用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")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.