wake-up-neo.com

Wie konvertiert man eine Liste, die aus Vektor unterschiedlicher Länge besteht, in einen verwendbaren Datenrahmen in R?

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. 

39
Ico

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

34
adibender

Ein Liner mit plyr

plyr::ldply(Word.list, rbind)
70
Ramnath

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"
10
juba

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)))
9
akrun

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)
3
andrasz

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

0
jgarces