2017-09-07 3 views
1

Angenommen, ich habe einen Vektor wieFunktion zu gruppieren Elemente eines Vektors/Liste

vec <- 0:10 

und eine Funktion wie

f <- function (x) x %% 3 

Gibt es eine eingebaute Funktion in R, die diesen Vektor brechen in Gruppen basierend auf dem Rückgabewert von f, wenn auf jedes Element angewendet? Wenn nicht, was ist der einfachste Weg dies mit Hilfe von eingebauten zu implementieren?

Der erwartete Rückgabewert ist

list(c(0,3,6,9), c(1,4,7,10), c(2,5,8)) 

Bei einem komplizierteren Beispiel kann ein Vektor von Strings nehmen und solche, die Gruppe zusammen anagrams sind (das heißt sie aus dem gleichen Buchstaben bestehen). In diesem Fall würde f einen String nehmen, ihn in Kleinbuchstaben schreiben und ihn sortieren. Auf Unix-Systemen gibt es eine Wortliste zur Verfügung:

words <- scan('/usr/share/dict/words', what=character, sep='\n') 

ich nicht darauf bestehen, diese speziellen Datenstrukturen (Vektor, Liste) über die Verwendung, wenn sie für diese Aufgabe in R.

+2

Es gibt 'split':' split (00.10, (00.10) %% 3) ' –

+1

würden Sie müssen' vec <- 00.10 'und dann' split (vec, f (vec)) '. Um Strings aufzubrechen, wie du es erwähnst, gibt es 'strsplit'. Wie 'strsplit (c (" das ist ein String "," und ein anderer "), split =" ")'. – lmo

+0

Danke. Werden Sie eine Antwort posten oder ist diese Frage zu einfach gehalten und ich lösche sie lieber? – Szabolcs

Antwort

2

split nicht die am besten geeignet sind kann einen Vektor unter anderem auf Basis von Faktoren in Listen aufteilen. Weitere Informationen finden Sie unter ?split. Ich interessierte mich dafür, den Vektor von Wörtern auf Anagrammen zu gruppieren. Also hier ist eine Lösung für die

vec = c("stop", "pots", "leaves") 
split(vec, sapply(vec, function(x) 
    paste(sort(unlist(strsplit(tolower(gsub(" ", "", x)), ""))), collapse = ""))) 
#$aeelsv 
#[1] "leaves" 

#$opst 
#[1] "stop" "pots" 
1

Sie dplyr verwenden könnte und verwandeln die Eingabe in ein data.frame. Von dort ist der Code zu lesen, einfacher:

library(dplyr) 
data.frame(
    value = vec, 
    stringsAsFactors = T 
) %>% 
mutate(
    result = f(value) 
) %>% 
group_by(result) %>% 
summarize(
    list_result = list(value) 
) %>% 
.$list_result 
Verwandte Themen