簡體   English   中英

分組面板數據框並創建變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM