简体   繁体   English

R:在向量列表中查找唯一的向量

[英]R: Find unique vectors in list of vectors

I have a list of vectors 我有一个向量列表

list_of_vectors <- list(c("a", "b", "c"), c("a", "c", "b"), c("b", "c", "a"), c("b", "b", "c"), c("c", "c", "b"), c("b", "c", "b"), c("b", "b", "c", "d"), NULL)

For this list I would like to know which vectors are unique in terms of their elements. 对于此列表,我想知道哪些向量在元素方面是唯一的。 That is, I would like the following output 也就是说,我想要以下输出

[[1]]
[1] "a" "b" "c"

[[2]]
[1] "b" "b" "c"

[[3]]
[1] "c" "c" "b"

[[4]]
[1] "b" "b" "c" "d"

[[5]]
[1] NULL

Is there a function in R for performing this check? R中是否有执行此检查的功能? Or do I need do a lot of workarounds by writing functions? 还是我需要通过编写函数来做很多变通办法?

My current not so elegant solution: 我目前没有那么优雅的解决方案:

# Function for turning vectors into strings ordered by alphabet
stringer <- function(vector) {
  if(is.null(vector)) {
    return(NULL)
  } else {
    vector_ordered <- vector[order(vector)]
    vector_string <- paste(vector_ordered, collapse = "")
    return(vector_string)
  }
}

# Identifying unique strings
vector_strings_unique <- unique(lapply(list_of_vectors, function(vector) 
stringer(vector)))
vector_strings_unique 

[[1]]
[1] "abc"

[[2]]
[1] "bbc"

[[3]]
[1] "bcc"

[[4]]
[1] "bbcd"

[[5]]
NULL

# Function for splitting the strings back into vectors 
splitter <- function(string) {
  if(is.null(string)) {
    return(NULL)
  } else {
    vector <- unlist(strsplit(string, split = ""))
    return(vector)
  }
}

# Applying function
lapply(vector_strings_unique, function(string) splitter(string))

[[1]]
[1] "a" "b" "c"

[[2]]
[1] "b" "b" "c"

[[3]]
[1] "c" "c" "b"

[[4]]
[1] "b" "b" "c" "d"

[[5]]
[1] NULL

It does the trick and could be rewritten as a single function, but there must be a more elegant solution. 它可以解决问题,可以将其重写为单个函数,但是必须有一个更优雅的解决方案。

We can sort the list elements, apply duplicated to get a logical index of unique elements and subset the list based on that 我们可以sort list元素进行sort ,应用duplicated元素以获得唯一元素的逻辑索引,并基于该元素对list子集化

list_of_vectors[!duplicated(lapply(list_of_vectors, sort))]
#[[1]]
#[1] "a" "b" "c"

#[[2]]
#[1] "b" "b" "c"

#[[3]]
#[1] "c" "c" "b"

#[[4]]
#[1] "b" "b" "c" "d"

#[[5]]
#NULL

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM