Как преобразовать список, состоящий из вектора разной длины в полезный кадр данных в R?

У меня есть (довольно длинный) список векторов. Векторы состоят из русских слов, которые я получил, используя strsplit() в предложениях.

Ниже приведена функция head() :

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

Обратите внимание, что векторы имеют разную длину.

Я хочу, чтобы я мог читать первые слова из каждого предложения, второе слово, третье и т. Д.

Желаемый результат будет примерно таким:

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

Я попытался просто использовать data.frame() но это не сработало, потому что строки имеют разную длину. Я также попробовал rbind.fill() из пакета plyr , но эта функция может обрабатывать только матрицы.

Здесь я нашел несколько других вопросов (именно там я получил помощь plyr ), но все они plyr объединения, например, двух фреймов данных разного размера.

Спасибо за вашу помощь.

попробуй это:

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

трюк в том, что,

 c(1:2)[1:4] 

возвращает вектор + два NA

Один вкладыш с plyr

 plyr::ldply(word.list, rbind) 

Вы можете сделать что-то вроде этого:

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

Который дает :

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

Другим вариантом является stri_list2matrix из 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" 

ПРИМЕЧАНИЕ. Данные из сообщения @ juba.

Или как @Valentin упомянул в комментариях

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

вы также можете использовать rbindlist() из data.table-package.

Преобразование векторов в data.table или data.frame и транспонирование (не уверен, что это значительно уменьшает скорость) с помощью lapply() . Затем rbindlist() их с rbindlist() – заполняя отсутствующие ячейки 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) 
Давайте будем гением компьютера.