2017-06-13 40 views
1

我想確定在哪一年觀察面板數據集中的個人並將信息註冊到另一個變量中。 個人可能會在連續的幾年中被觀察到,或者在一年或多年之後會出現連續的年度觀察結果。在R中的面板數據集中註冊個人的所有年份:

在DF下面,舉例來說,是在2000年和2001年觀察到的ID 1,而ID 2在2000年和2002年,觀察到,與間隙2001年

DF = data.table(年= c(2000,2000,2001,2001,2002,2002),ID = c(1,2,1,3,2,3),V1 = rep(「」,6))

df

上年| ID | V1

2000 | 1 |

2000 | 2 |

2001 | 1 |

2001 | 3 |

2002 | 2 |

2002 | 3 |

我在V1希望outpout然後爲每個ID包含觀察多年的一個鏈條:

年| ID | V1

2000 | 1 | 00/01

2000 | 2 | 00/02

2001 | 1 | 00/01

2001 | 3 | 01/02

2002 | 2 | 00/02

2002 | 3 | 01/02

或更好,因爲信息對ID的每次觀察都不重要:觀察年份的信息僅用於第一次觀察每個ID。

上年| ID | V1

2000 | 1 | 00/01

2000 | 2 | 00/02

2001 | 1 |

2001 | 3 | 01/02

2002 | 2 |

2002 | 3 |

感謝您的任何提示!

+0

目前還不清楚是什麼你打算用這些信息做。未來計算可能更有用的解決方案是將每個ID的觀察年限保存到單獨的命名列表中。對象,像這樣:'split(df $ Year,df $ ID)'。 – lmo

+0

我的想法是很容易地看到每個時期的頻率。也就是說,假設我通過使用表(df $ V1)得到期望的V1輸出(給定V1如上面的第二個表),我可以很容易地獲得觀察到的每個週期的觀察數。這是創建V1的範圍。 – Enrico

+0

並且爲每個ID分配其觀察到的時間點或時間段的信息,以便容易地創建子數據集,區分關於觀察到的時段的ID。 – Enrico

回答

0

以下是使用bypaste函數的一種方法。我們創建一個彙總表,然後將其合併回原始表。我已經離開了全年的價值(而不是子字符串),但如果需要的話,可以輕鬆完成。

df2 <- stack(by(df, df$ID, function(d) paste(d$Year, collapse = '/')), 
      stringsAsFactors = FALSE) 
df2$ind <- as.numeric(as.character(df2$ind)) #convert back to numeric 
merge(df, df2, by.x = 'ID', by.y = 'ind') 

    ID Year V1 values 
1: 1 2000 2000/2001 
2: 1 2001 2000/2001 
3: 2 2000 2000/2002 
4: 2 2002 2000/2002 
5: 3 2001 2001/2002 
6: 3 2002 2001/2002 

要獲得第一個觀測只是一個值的ID,我們可以使用dplyr包:

library(dplyr) 
merge(df, df2, by.x = 'ID', by.y = 'ind') %>% 
    select(-V1) %>% 
    group_by(ID) %>% 
    mutate(values = ifelse(Year == min(Year), values, '')) 

    ID Year values 
    <dbl> <dbl>  <chr> 
1  1 2000 2000/2001 
2  2 2000 2000/2002 
3  1 2001   
4  3 2001 2001/2002 
5  2 2002   
6  3 2002   
+0

太棒了!謝謝 ! – Enrico

相關問題