2012-07-18 173 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

相关问题