Ich habe eine (ziemlich lange) Liste von Vektoren. Die Vektoren bestehen aus russischen Wörtern, die ich mit der Funktion strsplit()
für Sätze erhalten habe.
Folgendes gibt head()
zurück:
[[1]]
[1] "модно" "создавать" "резюме" "в" "виде"
[[2]]
[1] "ты" "начианешь" "работать" "с" "этими"
[[3]]
[1] "модно" "называть" "блогер-рилейшенз" "―" "начинается" "задолго"
[[4]]
[1] "видел" "по" "сыну," "что" "он"
[[5]]
[1] "четырнадцать," "я" "поселился" "на" "улице"
[[6]]
[1] "широко" "продолжали" "род."
Beachten Sie, dass die Vektoren unterschiedlich lang sind.
Ich möchte die ersten Wörter aus jedem Satz, das zweite Wort, das dritte usw. lesen können.
Das gewünschte Ergebnis wäre etwa so:
P1 P2 P3 P4 P5 P6
[1] "модно" "создавать" "резюме" "в" "виде" NA
[2] "ты" "начианешь" "работать" "с" "этими" NA
[3] "модно" "называть" "блогер-рилейшенз" "―" "начинается" "задолго"
[4] "видел" "по" "сыну," "что" "он" NA
[5] "четырнадцать," "я" "поселился" "на" "улице" NA
[6] "широко" "продолжали" "род." NA NA NA
Ich habe versucht, einfach data.frame()
zu verwenden, aber das hat nicht funktioniert, weil die Zeilen unterschiedlich lang sind. Ich habe auch rbind.fill()
aus dem plyr
-Paket versucht, aber diese Funktion kann nur Matrizen verarbeiten.
Ich habe hier noch ein paar andere Fragen gefunden (hier bekam ich die plyr
-Hilfe), aber es ging nur darum, zwei Datenrahmen unterschiedlicher Größe zu kombinieren.
Danke für Ihre Hilfe.
versuche dies:
Word.list <- list(letters[1:4], letters[1:5], letters[1:2], letters[1:6])
n.obs <- sapply(Word.list, length)
seq.max <- seq_len(max(n.obs))
mat <- t(sapply(Word.list, "[", i = seq.max))
der Trick ist, dass
c(1:2)[1:4]
gibt den Vektor + zwei NAs zurück
Ein Liner mit plyr
plyr::ldply(Word.list, rbind)
Sie können so etwas tun:
## Example data
l <- list(c("a","b","c"), c("a2","b2"), c("a3","b3","c3","d3"))
## Compute maximum length
max.length <- max(sapply(l, length))
## Add NA values to list elements
l <- lapply(l, function(v) { c(v, rep(NA, max.length-length(v)))})
## Rbind
do.call(rbind, l)
Was gibt:
[,1] [,2] [,3] [,4]
[1,] "a" "b" "c" NA
[2,] "a2" "b2" NA NA
[3,] "a3" "b3" "c3" "d3"
Eine weitere Option ist stri_list2matrix
von library(stringi)
library(stringi)
stri_list2matrix(l, byrow=TRUE)
# [,1] [,2] [,3] [,4]
#[1,] "a" "b" "c" NA
#[2,] "a2" "b2" NA NA
#[3,] "a3" "b3" "c3" "d3"
HINWEIS: Daten aus dem Beitrag von @Juba.
Oder als @Valentin in den Kommentaren erwähnt
sapply(l, "length<-", max(lengths(l)))
sie können auch rbindlist()
aus dem data.table-package verwenden.
Konvertieren Sie Vektoren in data.table oder data.frame und setzen Sie sie mit Hilfe von lapply()
um (nicht sicher, ob dadurch die Geschwindigkeit stark verringert wird). Binden Sie sie dann mit rbindlist()
- Füllen der fehlenden Zellen mit NA:
l = list(c("a","b","c"), c("a2","b2"), c("a3","b3","c3","d3"))
dt = rbindlist(lapply(l, function(x) data.table(t(x))),
fill = TRUE)
Eine andere Option könnte sein, eine Funktion wie diese zu definieren (sie würde rbind.fill
nachahmen) oder sie direkt aus dem Paket rowr
zu verwenden:
cbind.fill <- function(...){
nm <- list(...)
nm <- lapply(nm, as.matrix)
n <- max(sapply(nm, nrow))
do.call(cbind, lapply(nm, function (x)
rbind(x, matrix(, n-nrow(x), ncol(x)))))
}
Grüße