【问题标题】:How do I get unique element from a vector, keeping its name? [duplicate]如何从向量中获取唯一元素,并保留其名称? [复制]
【发布时间】:2017-03-10 08:57:50
【问题描述】:

我知道有函数unique() 可以从向量中提取唯一值。但我失去了它的名字。

例如

vector = c("A" = 1, "B" = 2, "A" = 1, "C" = 3, "B" = 2, "D" = 3, "D" = 3)

如果我打印,我应该看到:

A B A C B D D
1 2 1 3 2 3 3

预期输出

A B C D
1 2 3 3

尝试:

如果我使用:unique(vector) 我只会得到1 2 3

如果我使用:vector[!duplicated(vector)] 我得到:

A B C 
1 2 3 

这很接近,但"D" = 3 不见了。

【问题讨论】:

  • x[!duplicated(paste(x, names(x)))]?

标签: r unique subset


【解决方案1】:
vector = c(A=1,B=2,A=1,C=3,B=2,D=3,D=3)

当你这样做时,

vector[!duplicated(vector)]

它在 vector 的值中查找重复项,而不是名称,因此您得到的输出是

A B C 
1 2 3 

如果您想找到唯一的名称,那么您应该在 namesvector 上运行 duplicated 函数

vector[!duplicated(names(vector))]

A B C D 
1 2 3 3 

使用unique也可以实现类似的输出

vector[unique(names(vector))]

A B C D 
1 2 3 3 

【讨论】:

  • 我认为他们想要独特的价值观,试试:vector = c(A=1,B=2,A=1,C=3,B=2,D=3,D=4)
  • 太棒了!我刚刚看到我在矢量上犯了一个错误,但是这是我需要的!
  • 我会这样做:v[!duplicated(names(v)) | !duplicated(v)]
  • @SaulGarcia 这不是您想要的,请尝试使用 D=3 和 D=4 而不是 D=3、D=3。
  • @zx8754 如果我对 OP 的理解正确,他们只需要唯一的名称,而不是唯一的名称和唯一的值。
【解决方案2】:

只是添加另一个替代方案,也可能涵盖值和名称之间的差异

library(dplyr)
data_frame(value = v, name = names(v)) %>%
  group_by(name, value) %>% # alternatively: group_by(name) if name value pair is always unique
  slice(1) %>%
  ungroup()

【讨论】:

  • 很好的解决方案,只是group_by df 很大时会很慢。
【解决方案3】:

我们可以使用match

vector[match(unique(names(vector)), names(vector))]
# A B C D 
# 1 2 3 3 

tapply

tapply(vector, names(vector), FUN = head, 1)
#  A B C D 
# 1 2 3 3 

或使用data.table

library(data.table)
data.table(Key = names(vector), Value = c(vector))[, Value[1L], Key]

【讨论】:

    猜你喜欢
    • 2021-04-15
    • 1970-01-01
    • 2021-11-24
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多