如何在数据框中找到元素的第一个和最后一个出现位置?

18

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

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 DATA步骤逐行读取表格,因此我可以使用类似以下语句的语句:
IF FIRST.V1 THEN DO ...

FIRST.V1只有在观察到V1中的元素第一次时才会返回TRUE。换句话说,它将对V1 [1]('1'的第一次出现),V1 [5]('2'的第一次出现)和V1 [9]('3'的第一次出现)返回true。LAST.指针函数以类似的方式运作,但是返回该元素的最后一次出现。

R中是否有任何模拟这个的东西?


也许是 duplicated() 函数?但很难确定,因为您没有真正告诉我们您的实际目标是什么。 - joran
可能有更加R风格的解决方案(例如,使用ddply),而不是逐行遍历数据集... - Ben Bolker
我不想逐行遍历数据框。我只需要一个函数,如果它是该列中值的第一次出现,则返回true,否则返回false。还有一个仅在该值的最后一次出现时返回true,否则返回false的函数。Spacedman下面的解决方案对于这些目的已经足够了。 - asteri
1个回答

25

你可以使用 duplicated 和 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

7
可以通过以下方式找到最后一个元素:LAST=!duplicated(v1,fromLast=TRUE) - Joshua Ulrich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接