2012-07-18 79 views
15

我已經徹底搜索了第一個直接R翻譯。和最後。 SAS DATA步驟中的指針,但似乎無法找到一個。對於那些不熟悉SAS的人,FIRST。是一個布爾值,用於標識表和LAST中給定元素的第一次出現。是標識最後一次出現的布爾值。例如,考慮下面的排序表:如何查找data.frame中元素的第一次和最後一次出現?

V1 V2 V3 
1  1  1 
1  1  2 
1  2  3 
1  2  4 
2  3  5 
2  3  6 
2  4  7 
2  4  8 
3  5  9 
3  5  10 
3  6  11 
3  6  12 

由於SAS數據步由線讀取錶行,我可以使用如下語句:

IF FIRST.V1 THEN DO ... 

FIRST.V1將返回TRUE當且僅當這是V1中第一次遇到這種情況。換句話說,對於V1 [1]('1'的第一次出現),V1 [5]('2'的第一次出現)和V1 [9]('3'的第一次出現) )。最後。指針以類似的方式起作用,但最終出現該元素。

有什麼R模擬此?

+0

也許'複製()'?但很難說,因爲你沒有真正告訴我們你的目標是什麼。 – joran 2012-07-18 17:13:27

+0

可能會有更多的R-ish解決方案(例如使用'ddply'),而不是一次循環數據集一行...... – 2012-07-18 17:21:57

+0

我不想實際上一行一行地遍歷data.frame。我只想要一個函數,如果它是該列中第一次出現的值,則返回true,否則返回false。此外,只有當它是最後一次出現的值時才返回true,否則返回false。 Spacedman的解決方案對於這些目的綽綽有餘。 – asteri 2012-07-18 17:26:26

回答

21

您可以複製和REV(去年)做到這一點:

> v1=c(1,1,1,2,2,3,3,3,3,4,4,5) 

> data.frame(v1,FIRST=!duplicated(v1),LAST=rev(!duplicated(rev(v1)))) 
    v1 FIRST LAST 
1 1 TRUE FALSE 
2 1 FALSE FALSE 
3 1 FALSE TRUE 
4 2 TRUE FALSE 
5 2 FALSE TRUE 
6 3 TRUE FALSE 
7 3 FALSE FALSE 
8 3 FALSE FALSE 
9 3 FALSE TRUE 
10 4 TRUE FALSE 
11 4 FALSE TRUE 
12 5 TRUE TRUE 
+0

太棒了!非常感謝你。 – asteri 2012-07-18 17:22:47

+5

最後一個也可以通過以下方式找到:'LAST =!duplicated(v1,fromLast = TRUE)' – 2012-07-18 17:36:10

相關問題