Como converter uma lista que consiste em vetor de diferentes comprimentos para um quadro de dados utilizável em R?

Eu tenho uma lista (bastante longa) de vetores. Os vetores consistem em palavras russas que obtive usando a function strsplit() em sentenças.

O seguinte é o que o head() retorna:

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

Note que os vetores são de comprimento diferente.

O que eu quero é poder ler as primeiras palavras de cada sentença, a segunda palavra, a terceira, etc.

O resultado desejado seria algo assim:

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

Eu tentei apenas usar data.frame() mas isso não funcionou porque as linhas são de tamanho diferente. Eu também tentei rbind.fill() do pacote plyr , mas essa function só pode processar matrizes.

Eu encontrei algumas outras perguntas aqui (é onde eu obtive a ajuda do plyr ), mas essas eram todas sobre a combinação, por exemplo, de dois frameworks de dados de tamanhos diferentes.

Obrigado pela ajuda.

tente isto:

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

o truque é que,

 c(1:2)[1:4] 

retorna o vetor + dois NAs

Um forro com plyr

 plyr::ldply(word.list, rbind) 

Você pode fazer algo assim:

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

Que dá :

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

Outra opção é stri_list2matrix da 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: Dados da postagem do @juba.

Ou como @Valentin mencionado nos comentários

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

você também pode usar o rbindlist() do pacote data.table.

Converta vetores em dados.table ou data.frame e transponha-os (não tenho certeza se isso reduz muito a velocidade) com a ajuda do lapply() . Em seguida, ligue-os com rbindlist() – preenchendo as células perdidas com 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)