2010-01-17 9 views
8

Tengo una lista que contiene 98 elementos. Pero cada elemento contiene cadenas de 0, 1, 2, 3, 4 o 5 caracteres.Generando un vector de la cantidad de elementos en cada elemento de la lista

Sé cómo obtener la longitud de la lista y de hecho someone has asked the question before y me votaron por presumiblemente haciendo una pregunta tan fácil.

Pero quiero un vector que tiene 98 elementos de largo con cada elemento que es un número entero de 0 a 5 que me indica cuántas cadenas de caracteres hay en cada elemento de la lista. Esperaba que lo siguiente funcionara, pero no fue así.

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

De mi pregunta verás que no sé realmente la nomenclatura de listas y elementos. Siéntete libre de enderezarme.

Respuesta

9

Farrel, no sigo exactamente como 'elemento' no es un tipo R. Tal vez usted tiene un list de longitud 98 donde cada elemento es un vector de cadena de caracteres?

En ese caso, considere esto:

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> 

por lo que hay que vector de la longitud de su lista, que le dice muchas cadenas de cada elemento de la lista tenía. No es el último do.call(rbind, someList) ya que obtuvimos una lista de lapply.

Si por el contrario desea contar la longitud de todas las cadenas en cada posición de la lista, reemplazar el simple length(x) con una nueva función de conteo de los personajes:

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> 

si eso no es lo que desea , ¿tal vez podrías simular algunos datos de entrada de ejemplo?

Editar:: En respuesta a sus comentarios, lo que quería es probablemente

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

Tenga en cuenta que yo paso en length, el nombre de una función, y no length(), la (muestra) cuerpo de una función. Debido a que es fácil mezclarlo, simplemente aplico casi siempre para envolver una función anónima como en mi primera respuesta.

Y sí, esto también se puede hacer con sólo sapply o incluso algunos de los **ply funciones:

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

La primera manera que lo hizo es lo que quiero. Déjame ir, intenta eso. – Farrel

+0

Yip, funcionó. Fantástico. De hecho, Sapply funcionó aún mejor porque creó un único vector simple que ahora puedo ir y encontrar en un marco de datos preexistente. Ahora puede explicarme cómo lapply (name.of.list, length()) y lapply (name.of.list, function (x) length (x)) son diferentes. – Farrel

+0

Por favor, vea la edición adicional en mi respuesta - en esencia 'length' es diferente de' length() 'y quiere la primera. –

0

El código siguiente acepta una lista y devuelve un vector de longitudes:

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

Todo esto parece muy complicado: hay una función que hace específicamente lo que estaba pidiendo:

lengths #note the plural "s" 

Usando datos de la muestra Dirks:

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

devolverá un vector de enteros llamado:

A B C 
2 1 3 
Cuestiones relacionadas