2013-03-08 73 views
0

我想將數據列添加到數據框中,其中列中的值基於另一列中特定因子的輸入順序。特別是對於我的數據,我希望第一次訪問某個點時需要「1」,第二次訪問時需要「2」,第三次訪問需要「3」等。但是,有些點對於給定的重複訪問日期並且應該共享相同的訪問號碼。添加具有基於特定因子的輸入順序的值的列

的數據幀預排序,看起來是這樣的:

Transect Point Date 
1  BEN  1 5/7/12 
2  BEN  1 5/10/12 
3  BEN  1 5/10/12 
4  BEN  2 5/8/12 
5  BEN  2 5/11/12 
6  BEN  2 5/13/12 

我希望得到的東西是這樣的:

Transect Point Date Vist 
1  BEN  1 5/7/12  1 
2  BEN  1 5/10/12  2 
3  BEN  1 5/10/12  2 
4  BEN  2 5/8/12  1 
5  BEN  2 5/11/12  2 
6  BEN  2 5/13/12  3 
+0

與[** this one **]非常緊密相關(http://stackoverflow.com/questions/15280472/in-r-how-do-i-create-consecutive-id-numbers-for - 每個重複-IN-A-單獨-v/15281528#15281528)。我會說它是重複的。 – Arun 2013-03-08 18:43:52

回答

3

假設您的data.frame被稱爲SODF,使用ave

within(SODF, { 
    Visit <- ave(Point, Point, FUN = seq_along) 
}) 
# Transect Point Date Visit 
# 1  BEN  1 5/7/12  1 
# 2  BEN  1 5/10/12  2 
# 3  BEN  1 5/13/12  3 
# 4  BEN  2 5/8/12  1 
# 5  BEN  2 5/11/12  2 

如果你超過一列編組,例如「斷面」和「點」,在ave聲明更改爲:

ave(Point, Transect, Point, FUN = seq_along) 

有,當然,其他的方法,利用基礎R和使用兩種封裝。其中幾項總結和@Arun在his answer here基準。


更新,以解決新的問題要求

我想到的考慮您的新要求,是先提取獨特的情況下,如上面做執行索引生成,併合併產生的表與一個快速的解決方案你原來的桌子。

SODFunique <- SODF[!duplicated(SODF), ] 
SODFunique <- within(SODFunique, { 
    Visit <- ave(Point, Transect, Point, FUN = seq_along) 
}) 
merge(SODF, SODFunique, sort = FALSE) 
# Transect Point Date Visit 
# 1  BEN  1 5/7/12  1 
# 2  BEN  1 5/10/12  2 
# 3  BEN  1 5/10/12  2 
# 4  BEN  2 5/8/12  1 
# 5  BEN  2 5/11/12  2 
# 6  BEN  2 5/13/12  3 
+0

我只是注意到這是一個重複的引用該帖子下的評論 – Arun 2013-03-08 18:44:26

+0

這工作很好,但我意識到現在另一個問題,我沒有提到我的第一篇文章。對於給定的日期,我確實有幾次重複訪問。想要編輯前面提到的代碼來解決這個問題嗎? – Flammulation 2013-03-08 18:50:37

+0

@ user2149445,我不知道。你期望如何解決這個問題。如果每個日期可能有多次訪問,那麼在本示例數據中的訪問列將全部爲1,而不是像您所描述的那樣是一個序列。 – A5C1D2H2I1M1N2O1R2T1 2013-03-08 18:53:05

相關問題