Ich habe zwei Vektoren:
vars <- c("SR", "PL")
vis <- c(1,2,3)
Basierend auf diesen Vektoren möchte ich den folgenden Vektor erstellen:
"SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"
Mit habe paste
ich folgendes Ergebnis:
paste(vars, vis, sep=".")
[1] "SR.1" "PL.2" "SR.3"
Wie kann ich den benötigten Vektor erstellen?
expand.grid
gibt eine Tabelle , die sortiert werden können , wenn Sie die Bestellung sein wollenSR,SR,PL,PL...
stattSR,PL,SR,PL
.Eine andere Möglichkeit besteht darin, das
each
Argument zu verwendenrep
:paste(rep(vars, each = length(vis)), vis, sep = ".")
Ich finde das einfacher als die Lösungen, die auf
apply
oder basierenexpand.grid
.quelle
Eine weitere Option
sprintf
in Kombination mitexpand.grid
:eg <- expand.grid(vis, vars) sprintf('%s.%s', eg[,2], eg[,1])
was gibt:
[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"
Erläuterung:
expand.grid
erstellen Sie alle Kombinationen der beiden Vektoren.sprintf
Fügt die beiden Vektoren gemäß dem angegebenen Format ('%s.%s'
) zusammen. Jeder%s
Teil des Formats wird durch die Elemente der Vektoren ersetzt.quelle
Um die Reihenfolge der angeforderten Zeichenfolgen in der Frage beizubehalten, können Sie diese beiden Modifikationen beider Methoden verwenden:
Ändern Sie die Reihenfolge der Vektoren und kombinieren Sie sie in umgekehrter Reihenfolge
apply(expand.grid(vis, vars), 1, function(x) paste(x[2], x[1], sep=".")) [1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"
oder transponieren Sie die Matrix, bevor Sie sie in einen Vektor konvertieren:
as.vector(t(outer(vars, vis, paste, sep="."))) [1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"
quelle
Diese alte Frage hat bereits eine akzeptierte Antwort. Da es jedoch als Dupe-Ziel verwendet wird, lohnt es sich meiner Meinung nach, eine
data.table
Lösung hinzuzufügen , die die Cross-Join- Funktion verwendetCJ()
:library(data.table) options(datatable.CJ.names=FALSE) # required with version version 1.12.0+ CJ(vars, vis)[, paste(V1, V2, sep =".")] #[1] "PL.1" "PL.2" "PL.3" "SR.1" "SR.2" "SR.3"
Falls die ursprüngliche Bestellung wichtig ist:
CJ(vars, vis, sorted = FALSE)[, paste(V1, V2, sep =".")] #[1] "SR.1" "SR.2" "SR.3" "PL.1" "PL.2" "PL.3"
Bearbeiten:
CJ()
hat das Standardverhalten mit Version 1.12.0 geändertWie in den Versionshinweisen von Version 1.12.0 (Punkt 3) angekündigt,
options(datatable.CJ.names=TRUE)
hat sich die Standardoption geändert.CJ()
Jetzt benennt es seine Eingaben automatisch genauas data.table()
.Daher muss der obige Code für
data.table
Version 1.12.0 und höher geändert werden :library(data.table) ### version 1.12.0+ CJ(vars, vis)[, paste(vars, vis, sep =".")]
und
CJ(vars, vis, sorted = FALSE)[, paste(vars, vis, sep =".")]
bzw.
quelle
Einige andere Optionen mit
purrr
:library(purrr) cross(list(vars, vis)) %>% map_chr(paste, sep = ".", collapse = ".") #[1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3"
Wir können auch verwenden
cross2
cross2(vars, vis) %>% map_chr(paste, sep = ".", collapse = ".") #[1] "SR.1" "PL.1" "SR.2" "PL.2" "SR.3" "PL.3"
quelle