Automatiser la récupération des valeurs d'un DF dans une liste

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Marion Combettes
Messages : 2
Enregistré le : 24 Jan 2018, 13:57

Automatiser la récupération des valeurs d'un DF dans une liste

Messagepar Marion Combettes » 24 Jan 2018, 14:16

Bonjour à tous, je suis nouvelle et surtout débutante en R. J'ai posté ce sujet sur un autre forum mais il n'a pas l'air très actif :(
Je me trouve devant un problème que je n'arrive pas à résoudre, j'espère que quelqu'un d'entre vous pourra m'aider ! voilà ma petite histoire:

J'ai un dataframe MyTable, qui ressemble à ça:

Code : Tout sélectionner

MyTable <- tribble( ~colA, ~colB, ~colC, ~colD,
                    0,2,0.5,1,
                    2,4,1,1,
                    5,25,2.5,1)
 

Mon but est de récupérer les valeurs de MyTable dans une liste comme ça : (je crée dans ma liste une séquence de chiffres avec la fct seq())

Code : Tout sélectionner

MyList <- list( liste1= seq(MyTable$colA[1],MyTable$colB[1],MyTable$colC[1]) , Val=MyTable$colD[1],
                liste2= seq(MyTable$colA[2],MyTable$colB[2],MyTable$colC[2]) , Val=MyTable$colD[2],
                liste3= seq(MyTable$colA[3],MyTable$colB[3],MyTable$colC[3]) , Val=MyTable$colD[3])
               
 

Jusque là, pas de problème, je crée bien une liste comme je le souhaite:

Code : Tout sélectionner

> str(MyList)
List of 6
 $ liste1: num [1:5] 0 0.5 1 1.5 2
 $ Val   : num 1
 $ liste2: num [1:3] 2 3 4
 $ Val   : num 1
 $ liste3: num [1:9] 5 7.5 10 12.5 15 17.5 20 22.5 25
 $ Val   : num 1
 
 


Mon problème, c'est que je veux automatiser la chose sur une application shiny. Et dans cette appli, le dataframe MyTable n'aura pas à chaque fois le même nombre de lignes !
Je voudrais donc arriver créer ma liste en fonction du nombre de lignes de MyTable.

Si MyTable à n lignes je veux une liste telle que MyList<- list( liste(1) = ... , liste(2)= ..., liste(n)= ... ) avec les valeurs correspondantes évidemment.

Ca fait 15 jours que je bloque sur le problème , j'imagine qu'il doit falloir boucler en utilisant nrow(MyTable) mais je n'y arrive pas, j'ai essayé en utilisant des fonction de purrr mais je ne maitrise pas les fonctions non plus !

Merci à l'âme charitable qui tentera d'éclaircir mes interrogations !

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: Automatiser la récupération des valeurs d'un DF dans une liste

Messagepar Logez Maxime » 24 Jan 2018, 14:32

Bonjour,

une possibilité :

Code : Tout sélectionner

library(dplyr)
MyTable %>% rowwise() %>% do(res = list(liste = seq(.$colA, .$colB, by = .$colC), Val = .$colD)) %>% as.list()
$res
$res[[1]]
$res[[1]]$liste
[1] 0.0 0.5 1.0 1.5 2.0

$res[[1]]$Val
[1] 1


$res[[2]]
$res[[2]]$liste
[1] 2 3 4

$res[[2]]$Val
[1] 1


$res[[3]]
$res[[3]]$liste
[1]  5.0  7.5 10.0 12.5 15.0 17.5 20.0 22.5 25.0

$res[[3]]$Val
[1] 1
C'est pas terrible dans la gestion des noms. On doit pouvoir faire mieux avec les fonctions maps et autres que je ne maîtrise pas.

Cordialement,
Maxime

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Automatiser la récupération des valeurs d'un DF dans une liste

Messagepar Mickael Canouil » 24 Jan 2018, 16:04

Bonjour,

en ajoutant un "unlist()" à la proposition de Maxime, le résultat est proche de celui mis en exemple:

Code : Tout sélectionner

> MyTable %>%
     rowwise() %>%
     do(res = list(liste = seq(.$colA, .$colB, by = .$colC), Val = .$colD)) %>%
     as.list() %>%
     unlist(., recursive = FALSE)

Image

et si on en met deux

Code : Tout sélectionner

> MyTable %>%
     rowwise() %>%
     do(res = list(liste = seq(.$colA, .$colB, by = .$colC), Val = .$colD)) %>%
     as.list() %>%
     unlist(., recursive = FALSE) %>%
     unlist(., recursive = FALSE)

Image

Mais comme l'a dit Maxime, il y a mieux et plus jolie^^
Mickaël
mickael.canouil.fr | rlille.fr

Bastien Gamboa
Messages : 151
Enregistré le : 13 Jan 2011, 21:31

Re: Automatiser la récupération des valeurs d'un DF dans une liste

Messagepar Bastien Gamboa » 25 Jan 2018, 08:54

Bonjour,

Comme l'ont dit Mickaël et Maxime y'a plus joli, mais il ne faut pas oublier qu'il peut y avoir plus moche :

Code : Tout sélectionner

temp <- 1:nrow(MyTable)
eval(parse(text=paste0("machin2 <- list(",
                       paste0("Liste", temp, "=seq(MyTable[", temp, ",1], MyTable[", temp, ",2], MyTable[", temp,
                              ",3]), Val=MyTable[", temp, ",4],", collapse=" "), " NULL)")))
length(machin2) <- length(machin2)-1

Sinon, je n'ai pas bien compris l'utilisation de la 4è colonne qui a le même nom dans la liste quelque soit la ligne à laquelle elle a appartenue. Si l'ajout de cette colonne dans la liste finale n'est pas nécessaire, une autre solution :

Code : Tout sélectionner

machin <- apply(MyTable, 1, function(x) seq(x[1], x[2], x[3]))
names(machin) <- paste0("Liste", 1:nrow(MyTable))

HTH,
Bastien

Marion Combettes
Messages : 2
Enregistré le : 24 Jan 2018, 13:57

Re: Automatiser la récupération des valeurs d'un DF dans une liste

Messagepar Marion Combettes » 25 Jan 2018, 09:13

Ça a l'air de fonctionner, merci beaucoup à vous 2 pour votre réactivité !

J'essaierai de trouver mieux et plus joli plus tard, déjà pour l'instant il va falloir que je comprenne comment marche votre code ... :D

Cordialement.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité