2017-04-21 8 views
2

Ich habe eine Liste von VektorenR: Finden Sie einzigartige Vektoren in der Liste der Vektoren

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) 

Für diese Liste würde ich gerne wissen, welche Vektoren sind einzigartig in ihrer Elemente. Das heißt, ich möchte die folgende Ausgabe haben

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

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

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

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

[[5]] 
[1] NULL 

Gibt es eine Funktion in R für die Durchführung dieser Überprüfung? Oder muss ich viele Problemumgehungen machen, indem ich Funktionen schreibe?

Meine aktuelle nicht so elegante Lösung:

# 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 

Es funktioniert den Trick und als eine einzige Funktion neu geschrieben werden könnte, aber es muss eine elegantere Lösung.

Antwort

3

Wir haben die list Elemente sort können, gelten duplicated einen logischen Index von einzigartigen Elemente zu erhalten und die list auf, dass

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 
+0

Dank basierte Teilmenge, dann ist dies viel eleganter! Ich habe zunächst versucht, "unique" und "duplicated" zu verwenden, aber irgendwie fehlgeschlagen aufgrund von Fehlern bei der Behandlung von "NULL". Das funktioniert wie Charme! –

Verwandte Themen