2 Stimmen

Matrix in Schleife mit Vektoren unterschiedlicher Länge füllen

Ich habe eine Zeit lang mit diesem Problem in R zu kämpfen gehabt:

Nehmen wir an, ich habe eine for Schleife, die über 9 Datendateien läuft. In dieser Schleife extrahiere ich einen kurzen Vektor aus einem längeren Vektor. Einfach.

Danach, noch während der Schleife, möchte ich eine Matrix mit dem frisch extrahierten kurzen Vektor füllen und die Matrix in einer Datei speichern. Nicht einfach, denn keiner der Kurzvektoren hat die gleiche Länge. Um das Problem zu umgehen, habe ich versucht, die Vektoren direkt (noch in der Schleife) in einer Datei zu speichern. .csv Datei mit write.table() y append=TRUE aber R fügt alle 9 Vektoren in dieselbe Spalte ein, obwohl ich 9 Spalten haben möchte. Gibt es etwas wie by.column=TRUE existieren?

So oder so, ich möchte nur meine 9 kurzen Vektoren in 9 Spalten in einer Datendatei haben. Mir scheint, dass ich mit der zweiten Lösung nicht allzu weit komme.

Hat jemand eine Idee, wie man dieses kleine Programm endlich fertigstellen kann? Ich wäre sehr dankbar.

Vielen Dank für Ihre Zeit Michel

1voto

Josh O'Brien Punkte 154170

Ich würde vorschlagen, dass Sie Ihren Arbeitsablauf etwas anpassen und etwa so vorgehen:

  1. Sammeln Sie zunächst alle Vektoren in einem einzigen R-List-Objekt.

  2. Massieren Sie die Liste der Vektoren noch in R in eine Matrix oder einen data.frame. (Dies wird einfacher sein, wenn Sie alle Vektoren extrahiert haben und die Länge des längsten Vektors kennen).

  3. Erst dann schreiben Sie die resultierende Tabelle mit einem einzigen Aufruf von write.table o write.csv .

Hier ist ein Beispiel:

## Set up your for() loop or lapply() call so that it returns a list structure 
## like 'l'
l <- list(a=1:9, b=1:2, c=1:5)

## Make a matrix from the list, with shorter vectors filled out with ""s
n <- max(sapply(l, length))
ll <- lapply(l, function(X) {
    c(as.character(X), rep("", times = n - length(X)))
})
out <- do.call(cbind, ll)                 

## Then output it however you'd like. (Here are three options.)
# write.csv(out, file="summary.csv")
# write.csv(out, file="summary.csv", quote=FALSE)
# write.table(out, file="summary.txt", row.names=FALSE, quote=FALSE, sep="\t")

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X