如何删除向量中的重复元素,类似于Python中的"set"

ash*_*him 42 python r duplicates

我有一个带有重复元素的向量,并希望将它们删除,以便每个元素只出现一次.

在Python中,我可以Set用向量构造一个来实现这个,但是我怎么能在R中做到这一点?

小智 71

你可以看看unique功能.

 > v = c(1, 1, 5, 5, 2, 2, 6, 6, 1, 3)
 > unique(v)
 [1] 1 5 2 6 3
Run Code Online (Sandbox Code Playgroud)


dar*_*sco 11

这也是一样的.较慢,但如果您还需要重复项的逻辑向量,则非常有用:

v[duplicated(v)]
Run Code Online (Sandbox Code Playgroud)

  • 这也有可能在命名向量中保留名称,而`unique`只是删除它们. (2认同)
  • 这很好,但是如果你想实际上_remove_你应该做的元素`v [!duplicated(v)]`.在这种情况下,它将始终保留第一个副本,我想知道是否有办法改变它(并随机选择其中一个副本)? (2认同)

Pau*_*eux 7

要仅删除连续的重复元素,您可以将向量与其自身的移位版本进行比较:

v <- c(1, 1, 5, 5, 5, 5, 2, 2, 6, 6, 1, 3, 3)
v[c(TRUE, !v[-length(v)] == v[-1])]
[1] 1 5 2 6 1 3
Run Code Online (Sandbox Code Playgroud)

使用dplyr可以更优雅地编写相同的内容

library(dplyr)
v[v != lag(v)]
[1] NA  5  2  6  1  3
Run Code Online (Sandbox Code Playgroud)

lag()返回的 NA删除了第一个值,为了保留第一个值,您可以将默认值更改为与第一个值不同的值。

v[v != lag(v, default = !v[1])]
[1] 1 5 2 6 1 3
Run Code Online (Sandbox Code Playgroud)