在R中识别向量中最后出现的重复项

3

我希望能够识别向量中所有唯一的值以及多个值的最后出现实例。例如,我希望能够确定位置。

c(2,3,4,6,7)

在向量中:

v <- c("m", "m", "k", "r", "l", "o", "l")

我看到

(duplicated(v) | duplicated(v, fromLast = T))

此代码可以识别所有重复值,但我只想识别每个重复元素中最后一个出现的实例。

如何在不使用循环的情况下实现?


1
为什么不只用条件语句的后半部分呢? - IRTFM
3个回答

5

您需要:

duplicated(v)

[1] FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE

# and for index

which(duplicated(v))
[1] 2 7

或者像akrun建议的那样:
which(!duplicated(v, fromLast = TRUE))

[1] 2 3 4 6 7

1
好答案!我总是忘记使用fromLast选项 :P - ThomasIsCoding
1
和我一样。这里akrun再次提供了很大的帮助!!!我也喜欢你的答案,我又学到了新知识,像往常一样! - TarJae

2
你可以像这样做:

您可以采取以下方法:

library(dplyr)

v %>% 
  as_tibble() %>% 
  mutate(index = row_number()) %>% 
  group_by(value) %>% 
  mutate(id=row_number()) %>%
  filter(id == max(id))

这给我们带来了:
# A tibble: 5 × 3
# Groups:   value [5]
  value index    id
  <chr> <int> <int>
1 m         2     2
2 k         3     1
3 r         4     1
4 o         6     1
5 l         7     2

此外,如果您只想获取索引,可以执行以下操作:

v %>% 
  as_tibble() %>% 
  mutate(index = row_number()) %>% 
  group_by(value) %>% 
  mutate(id=row_number()) %>%
  filter(id == max(id)) %>%
  pull(index)

...要获取:

[1] 2 3 4 6 7

1
我们可以尝试。
> sort(tapply(seq_along(v), v, max))
m k r o l 
2 3 4 6 7

或者

> unique(ave(seq_along(v), v, FUN = max))
[1] 2 3 4 7 6

或者

> rev(length(v) - which(!duplicated(rev(v))) + 1)
[1] 2 3 4 6 7

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