notas - ¿Cómo seleccionar directamente la misma columna de todas las listas anidadas dentro de una lista?
listas en html ejemplos (2)
¿Es posible seleccionar directamente una columna de todas las listas anidadas dentro de una lista?
Mi lista se crea utilizando agregados () con tabla ():
AgN=aggregate(data,by=list(d$date),FUN=table,useNA="no")
AgN$x
ve como:
$`0`
1 2 3 9 11
0.447204969 0.438509317 0.096894410 0.009937888 0.007453416
$`1`
1 2 4 8 11
0.489974937 0.389724311 0.102756892 0.006265664 0.011278195
…
$n
Quiero obtener un vector de una columna específica de cada tabla, por ejemplo, un vector que contenga los valores de todas las columnas llamadas "1". Todavía soy un principiante en R, pero incluso después de buscar e intentar durante mucho tiempo no encontré una buena solución. Si quiero obtener el campo de una lista, simplemente puedo indexarlo entre paréntesis, por ejemplo, [i, j].
En línea, encontré algunos ejemplos de matrices, así que intenté hacer lo mismo, al principio solo seleccioné una columna de lista anidada con AgN$x[1][1]
, pero aún se está seleccionando una lista completa:
$
0
1 2 3 8 11
0,447204969 0,438509317 0,096894410 0,009937888 0,007453416
Mi siguiente intento fue AgN$x[[1]][1]
, y estaba funcionando:
1
0.447205
Así que intenté hacer lo mismo para seleccionar el valor de cada primera columna de todas las listas anidadas:
AgN$x[[1:length(AgN$x]][1]
Recursive indexing failed at level 2
Aparentemente, el problema es que está prohibido seleccionar un rango si utiliza un paréntesis doble.
Mi último intento fue usar un bucle for:
cduR=NULL
for (i in 1:length(AgN$x)){
t=AgN$x[[i]]
cduR=c(cduR,as.vector(t["1"]))
}
Finalmente, hasta ahora eso parece funcionar. Pero de esa manera tuve que construir un bucle cada vez que quisiera seleccionar columnas. ¿No hay manera directa?
Gracias por tu ayuda.
Asumiendo que tienes algo como lo siguiente:
myList <- list(`0` = c(`1` = 10, `2` = 20, `3` = 30, `4` = 72),
`1` = c(`1` = 15, `2` = 9, `3` = 7))
myList
# $`0`
# 1 2 3 4
# 10 20 30 72
#
# $`1`
# 1 2 3
# 15 9 7
Use sapply()
o lapply()
para ingresar a su lista y extraer las columnas que desee. Algunos ejemplos.
# As a list of one-column data.frames
lapply(myList, `[`, 1)
# $`0`
# 1
# 10
#
# $`1`
# 1
# 15
# As a list of vectors
lapply(myList, `[[`, 1)
# $`0`
# [1] 10
#
# $`1`
# [1] 15
# As a named vector
sapply(myList, `[[`, 1)
# 0 1
# 10 15
# As an unnamed vector
unname(sapply(myList, `[[`, 1))
# [1] 10 15
Otras variantes de la sintaxis que también lo llevan allí incluyen:
## Same output as above, different syntax
lapply(myList, function(x) x[1])
lapply(myList, function(x) x[[1]])
sapply(myList, function(x) x[[1]])
unname(sapply(myList, function(x) x[[1]]))
Un ejemplo de lista anidada
Si tiene listas anidadas (listas dentro de listas), pruebe las siguientes variantes.
# An example nested list
myNestedList <- list(A = list(`0` = c(`1` = 10, `2` = 20, `3` = 30, `4` = 72),
`1` = c(`1` = 15, `2` = 9, `3` = 7)),
B = list(`0` = c(A = 11, B = 12, C = 13),
`1` = c(X = 14, Y = 15, Z = 16)))
# Run the following and see what you come up with....
lapply(unlist(myNestedList, recursive = FALSE), `[`, 1)
lapply(unlist(myNestedList, recursive = FALSE), `[[`, 1)
sapply(unlist(myNestedList, recursive = FALSE), `[[`, 1)
rapply(myNestedList, f=`[[`, ...=1, how="unlist")
Tenga en cuenta que para lapply()
y sapply()
necesita usar unlist(..., recursive = FALSE)
mientras que para rapply()
(recursive apply), consulte la lista directamente.
Un ejemplo no creo que esté explícitamente en la lista, pero también funciona si tiene una lista de data.frames, matrix, xts, zoo, etc. con nombres de fila y columna, posteriormente puede devolver una fila, columna o colección completa con el siguiente sintaxis:
Listado con objetos de formato:
0% 1% 10% 50% 90% 99% 100%
Sec.1 -0.0005259283 -0.0002644018 -0.0001320010 -0.00005253342 0.00007852480 0.0002375756 0.0007870917
Sec.2 -0.0006620675 -0.0003931340 -0.0001588773 -0.00005251963 0.00007965378 0.0002121163 0.0004190017
Sec.4 -0.0006091183 -0.0003994136 -0.0001859032 -0.00005230263 0.00010592379 0.0003165986 0.0007870917
Sec.8 -0.0007679577 -0.0005321807 -0.0002636040 -0.00005232452 0.00014492480 0.0003930241 0.0007870917
Sec.16 -0.0009055318 -0.0007448356 -0.0003449334 -0.00005290166 0.00021238287 0.0004772207 0.0007870917
Sec.32 -0.0013007873 -0.0009552231 -0.0005243472 -0.00007836480 0.00028928104 0.0007382848 0.0013002350
Sec.64 -0.0016409500 -0.0012383696 -0.0006617173 -0.00005280668 0.00042354939 0.0011721508 0.0018579966
Sec.128 -0.0022575471 -0.0018858823 -0.0008466965 -0.00005298436 0.00068616576 0.0014665900 0.0027616991
Código (observe el índice de la primera fila vacía, especificando todas las filas)
simplify2array(lapply(listOfIdenticalObjects,`[`,,"50%"))
Salida
ListItem1 ListItem2 ListItem3 ListItem4 ListItem5
Sec.1 -0.00005253342 -0.00004673443 -0.0001112780 -0.00001870960 -0.00002051009
Sec.2 -0.00005251963 -0.00004663200 -0.0001112904 -0.00001878075 0.00000000000
Sec.4 -0.00005230263 -0.00004669297 -0.0001112780 -0.00001869911 -0.00002034403
Sec.8 -0.00005232452 -0.00004663635 -0.0001111296 -0.00001926096 0.00000000000
Sec.16 -0.00005290166 -0.00004668207 -0.0001109570 0.00000000000 0.00000000000
Sec.32 -0.00007836480 0.00000000000 -0.0001111667 -0.00001894496 0.00000000000
Sec.64 -0.00005280668 0.00000000000 -0.0001110926 -0.00001878305 0.00000000000
Sec.128 -0.00005298436 0.00004675191 0.0000000000 -0.00005582568 0.00001020502