web-dev-qa-db-fra.com

Comment sélectionner directement la même colonne dans toutes les listes imbriquées d'une liste?

est-il possible de sélectionner directement une colonne de toutes les listes imbriquées dans une liste?
Ma liste est créée en utilisant aggreg () avec table ():

AgN=aggregate(data,by=list(d$date),FUN=table,useNA="no")

AgN$x ressemble à:

$`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

Je veux obtenir un vecteur d'une colonne spécifique de chaque tableau, par exemple. un vecteur contenant les valeurs de toutes les colonnes nommées "1" . Je suis toujours un débutant R, mais même après une longue recherche et tentative, je n’ai trouvé aucune solution de Nice. Si je veux obtenir le champ d’une liste, je peux simplement l’indexer entre crochets, par exemple. [i, j].
En ligne, j’ai trouvé quelques exemples de matrices, j’ai donc essayé de faire la même chose, en ne sélectionnant au début qu’une colonne de la liste imbriquée avec AgN$x[1][1], mais c’est toujours une liste entière:

$ 0

     1           2           3           8          11 

0.447204969 0.438509317 0.096894410 0.009937888 0.007453416 

Mon prochain essai était AgN$x[[1]][1], et cela fonctionnait: 

  1 

0,447205 

J'ai donc essayé de sélectionner la même valeur pour chaque première colonne de toutes les listes imbriquées:

AgN$x[[1:length(AgN$x]][1]
Recursive indexing failed at level 2

Apparemment, le problème est qu’il est interdit de sélectionner une plage si vous utilisez des crochets doubles.

Mon dernier essai a été d'utiliser une boucle for: 

cduR=NULL 
for (i in 1:length(AgN$x)){
t=AgN$x[[i]]
cduR=c(cduR,as.vector(t["1"]))
}

Enfin, jusqu'à présent, cela semble fonctionner. Mais de cette façon, je devais créer une boucle chaque fois que je voulais sélectionner des colonnes. N'y a-t-il pas de voie directe?

Merci de votre aide.

25
Lukas

En supposant que vous ayez quelque chose comme ce qui suit:

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 

Utilisez sapply() ou lapply() pour entrer dans votre liste et extraire les colonnes de votre choix. Quelques exemples.

# 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

Parmi les autres variantes de la syntaxe qui vous y amènent, citons:

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

A Nested List Exemple

Si vous avez avez des listes imbriquées (listes dans des listes), essayez les variantes suivantes.

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

Notez que pour lapply() et sapply(), vous devez utiliser unlist(..., recursive = FALSE) tandis que pour rapply() (application récursive), vous vous référez directement à la liste.

47

Un exemple qui, à mon avis, ne figure pas explicitement dans la liste mais ne fonctionne pas aussi est que si vous avez une liste de data.frames, matrix, xts, Zoo, etc. avec des noms de ligne et de colonne, vous pouvez ensuite renvoyer une ligne, une colonne ou une collection entière avec syntaxe suivante:

Liste avec objets de format:

                           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

Code (notez le premier index de ligne vide, en spécifiant toutes les lignes)

simplify2array(lapply(listOfIdenticalObjects,`[`,,"50%"))

Sortie

                     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
0
theGreatKatzul