如何在data.frame中查找元素的第一次和最后一次出现?

如何在data.frame中查找元素的第一次和最后一次出现?,r,dataframe,sas,R,Dataframe,Sas,我已经用尽全力寻找第一个直接的R翻译。最后。SAS数据步骤中的指针,但似乎找不到。对于那些不熟悉SAS的人,首先。是一个布尔值,用于标识给定元素在表中的第一次出现和最后一次出现。是标识最后一个外观的布尔值。例如,考虑以下排序表: 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

我已经用尽全力寻找第一个直接的R翻译。最后。SAS数据步骤中的指针,但似乎找不到。对于那些不熟悉SAS的人,首先。是一个布尔值,用于标识给定元素在表中的第一次出现和最后一次出现。是标识最后一个外观的布尔值。例如,考虑以下排序表:

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 ...
当且仅当这是V1中第一次遇到观测时,FIRST.V1才会返回TRUE。换句话说,对于V1[1](第一次出现“1”)、V1[5](第一次出现“2”)和V1[9](第一次出现“3”)来说,它将返回true。最后。指针以类似的方式起作用,但具有该元素的最终外观


R中是否有类似的功能?

您可以使用duplicated和rev(最后一个)来实现这一点:


可能是重复的()?但很难说,因为你还没有真正告诉我们你的实际目标是什么。可能会有一个更R-ish的解决方案(例如,使用
ddply
),而不是一次一行地循环数据集……我不想一行一行地循环数据帧。我只想要一个函数,如果它是该列中值的第一次出现,则返回true,否则返回false。此外,仅当它是值的最后一次出现时才返回true,否则返回false。下面Spacedman的解决方案足以满足这些目的。Last也可以通过以下途径找到:
Last=!重复(v1,fromLast=TRUE)
> 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