2013-03-04 14 views
28

Ho una (abbastanza lunga) lista di vettori. I vettori consistono in parole russe che ho ottenuto usando la funzione strsplit() sulle frasi.Come convertire un elenco costituito da vettore di diverse lunghezze in un frame di dati utilizzabile in R?

Quanto segue è ciò che head() rendimenti:

[[1]] 
[1] "модно"  "создавать" "резюме" "в"   "виде"  

[[2]] 
[1] "ты"  "начианешь" "работать" "с"   "этими"  

[[3]] 
[1] "модно"   "называть"   "блогер-рилейшенз" "―"    "начинается"  "задолго"   

[[4]] 
[1] "видел" "по" "сыну," "что" "он" 

[[5]] 
[1] "четырнадцать," "я"    "поселился"  "на"   "улице"   

[[6]] 
[1] "широко"  "продолжали" "род." 

Nota i vettori sono di diversa lunghezza.

Quello che voglio è quello di essere in grado di leggere le prime parole di ogni frase, la seconda parola, il terzo, 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 

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

Ho trovato alcune altre domande qui (è qui che ho ricevuto l'aiuto plyr da), ma queste erano tutte combinate per combinare due frame di dati di dimensioni diverse.

Grazie per il vostro aiuto.

+2

forse 'sapply (1: lunghezza (your_list), la funzione (j) yourlist [[j]] [1])'? –

risposta

25

provare 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 AN

+7

questo potrebbe essere ulteriormente condensato in una riga: 'sapply (word.list, '[', seq (max (sapply (word.list, length))))' (come mostrato [** qui ** ] (http://stackoverflow.com/questions/5531471/combining-unequal-columns-in-r)) – Arun

+2

Per coloro che userebbero la soluzione a una linea di @ Arun, si noti che deve esserci una trasposizione 't()' per creare le colonne appropriate, come nella domanda originale. – Ashe

9

Si può fare qualcosa di simile:

## 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" 
+1

Ti alzi troppo presto. Ero a metà strada digitando esattamente quella soluzione ~ _ *. –

+1

Troppo presto? È più di 1PM qui :) – juba

+0

+1 per te, stavo per pubblicare la stessa risposta, sei veloce !! –

58

uno di linea con plyr

plyr::ldply(word.list, rbind) 
+0

Penso che questa risposta sia migliore e più concisa! –

7

Un'altra opzione è 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: I dati da @ post di Juba.

O come @Valentin menzionati nelle osservazioni

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

Penso che l'elegante soluzione R di base fornita [qui] (https://stackoverflow.com/questions/33613337/the-simplest-way-to-convert-a-list-with-various-length-vectors-to-a -data-frame-i # answer-33622855) vale la pena di essere menzionato pure: 'sapply (l," length <- ", max (lengths (l)))' – Valentin

Problemi correlati