2010-01-17 7 views
8

Ho una lista contenente 98 articoli. Ma ogni elemento contiene 0, 1, 2, 3, 4 o 5 stringhe di caratteri.Generazione di un vettore del numero di articoli in ciascuna voce dell'elenco

So come ottenere la lunghezza dell'elenco e di fatto someone has asked the question before e ho votato per presumibilmente facendo una domanda così facile.

Ma voglio un vettore lungo 98 elementi con ogni elemento da un numero intero compreso tra 0 e 5 che mi dice quante stringhe di caratteri ci sono in ciascuna voce dell'elenco. Mi aspettavo che quanto segue funzionasse, ma non è così.

lapply(name.of.list,length()) 

Dalla mia domanda si vedrà che non conosco la nomenclatura delle liste e degli articoli. Sentiti libero di raddrizzarmi.

risposta

9

Farrel, non seguo esattamente come 'elemento' non è un tipo R. Forse hai uno list di lunghezza 98 in cui ogni elemento è un vettore di stringa di caratteri?

In questo caso, considerare questo:

R> fl <- list(A=c("un", "deux"), B=c("one"), C=c("eins", "zwei", "drei")) 
R> lapply(fl, function(x) length(x)) 
$A 
[1] 2 

$B 
[1] 1 

$C 
[1] 3 
R> do.call(rbind, lapply(fl, function(x) length(x))) 
    [,1] 
A 2 
B 1 
C 3 
R> 

è, come ci si vettore della lunghezza della vostra lista, che ti dice molte stringhe ogni elemento della lista aveva. Non l'ultimo do.call(rbind, someList) come abbiamo ottenuto una lista dal lapply.

Se d'altra parte si desidera contare la lunghezza di tutte le stringhe ad ogni posizione di lista, sostituire la semplice length(x) con una nuova funzione di conteggio dei caratteri:

R> lapply(fl, function(x) { sapply(x, function(y) nchar(y)) }) 
$A 
    un deux 
    2 4 

$B 
one 
    3 

$C 
eins zwei drei 
    4 4 4 

R> 

se questo non è che tu vuoi , forse potresti prendere in giro alcuni dati di input di esempio?

Edit:: In risposta ai vostri commenti, quello che si voleva è probabilmente

R> do.call(rbind, lapply(fl, length)) 
    [,1] 
A 2 
B 1 
C 3 
R> 

noti che mi passa in length, il nome di una funzione, e non length(), il (visualizzato) corpo di una funzione. Perché è facile confondersi, semplicemente mi limito ad avvolgere quasi sempre una funzione anonima come nella mia prima risposta.

E sì, questo può essere fatto anche con un solo sapply o addirittura alcune delle **ply funzioni:

R> sapply(fl, length) 
A B C 
2 1 3 
R> laply(fl, length) 
[1] 2 1 3 
R> 
+0

Il primo modo l'avete fatto è quello che voglio. Fammi provare. – Farrel

+0

Sì, ha funzionato. Fantastico. In effetti, ha funzionato ancora meglio perché ha creato un semplice vettore singolo che ora posso inserire e archiviare su un dataframe preesistente. Ora puoi spiegarmi come lapply (name.of.list, length()) e lapply (name.of.list, function (x) length (x)) sono differenti. – Farrel

+0

Si prega di vedere la modifica aggiuntiva alla mia risposta - in sostanza 'length' è diverso da' length() 'e si desidera il primo. –

0

Il codice di seguito accetta un elenco e restituisce un vettore di lunghezze:

x = c("vectors", "matrices", "arrays", "factors", "dataframes", "formulas", 
     "shingles", "datesandtimes", "connections", "lists") 
xl = list(x) 
fnx = function(xl){length(unlist(strsplit(x, "")))} 
lv = sapply(x, fnx) 
0

Tutto ciò sembra molto complicato: esiste una funzione che fa specificamente ciò che stavi chiedendo:

lengths #note the plural "s" 

Utilizzando i dati di esempio Dirks:

fl <- list(A=c("un", "deux"), B=c("one"), C=c("eins", "zwei", "drei")) 
lengths(fl) 

restituirà un vettore intero nome:

A B C 
2 1 3 
Problemi correlati