Come convertire un elenco costituito da un vettore di diverse lunghezze in un frame di dati utilizzabile in R?

Ho una lista (abbastanza lunga) di vettori. I vettori consistono in parole russe che ho ottenuto usando la funzione strsplit() sulle frasi.

Il seguente è ciò che head() restituisce:

 [[1]] [1] "модно" "создавать" "резюме" "в" "виде" [[2]] [1] "ты" "начианешь" "работать" "с" "этими" [[3]] [1] "модно" "называть" "блогер-рилейшенз" "―" "начинается" "задолго" [[4]] [1] "видел" "по" "сыну," "что" "он" [[5]] [1] "четырнадцать," "я" "поселился" "на" "улице" [[6]] [1] "широко" "продолжали" "род." 

Nota che i vettori sono di diversa lunghezza.

Quello che voglio è essere in grado di leggere le prime parole di ogni frase, la seconda parola, la terza, ecc.

Il risultato desiderato sarebbe qualcosa di simile a questo:

  P1 P2 P3 P4 P5 P6 [1] "модно" "создавать" "резюме" "в" "виде" NA [2] "ты" "начианешь" "работать" "с" "этими" NA [3] "модно" "называть" "блогер-рилейшенз" "―" "начинается" "задолго" [4] "видел" "по" "сыну," "что" "он" NA [5] "четырнадцать," "я" "поселился" "на" "улице" NA [6] "широко" "продолжали" "род." NA NA NA 

Ho provato a usare solo data.frame() ma non ha funzionato perché le file hanno una lunghezza diversa. Ho anche provato rbind.fill() dal pacchetto plyr , ma quella funzione può solo elaborare le matrici.

Ho trovato alcune altre domande qui (è lì che ho ricevuto l’aiuto plyr ), ma quelle riguardavano solo la combinazione di due frame di dati di dimensioni diverse.

Grazie per l’aiuto.

prova questo:

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

il trucco è che,

 c(1:2)[1:4] 

restituisce il vettore + due NA

Un rivestimento con plyr

 plyr::ldply(word.list, rbind) 

Puoi fare qualcosa del genere:

 ## 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) 

Che dà :

  [,1] [,2] [,3] [,4] [1,] "a" "b" "c" NA [2,] "a2" "b2" NA NA [3,] "a3" "b3" "c3" "d3" 

Un’altra opzione è stri_list2matrix dalla 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" 

NOTA: dati dal post di @ juba.

O come @Valentin menzionato nei commenti

 sapply(l, "length<-", max(lengths(l))) 

potresti anche usare rbindlist() da data.table-package.

Converti i vettori in data.table o data.frame e traspone (non è sicuro se questo riduce molto la velocità) con l’aiuto di lapply() . Quindi rbindlist() con rbindlist() – riempiendo le celle mancanti con 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)