Transformer une liste de taille variable en data.frame

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

Christophe Genolini
Messages : 690
Enregistré le : 12 Juin 2006, 21:37
Contact :

Transformer une liste de taille variable en data.frame

Messagepar Christophe Genolini » 11 Juin 2019, 14:28

Bonjour

J'ai un data.frame constitué de "j" colonnes d'integer. Je souhaite calculer les effectifs de chaque colonne et avoir le résultat sous forme d'une matrice ayant "j" colonnes, une ligne par modalité. Exemple :

Code : Tout sélectionner

 
 dn <- data.frame(a=c(1:4,1),b=c(0,1,0,0,1),d=c(1,2,3,2,1))
 

Alors je souhaite :

Code : Tout sélectionner

    a  b  d
0  NA  3 NA
1   2  2  2
2   1 NA  2
3   1 NA  1
4   1 NA NA

Avez-vous une idée de comment faire ?

Merci !
Christophe

Pierre-Yves Berrard
Messages : 692
Enregistré le : 12 Jan 2016, 23:30

Re: Transformer une liste de taille variable en data.frame

Messagepar Pierre-Yves Berrard » 11 Juin 2019, 14:47

Bonjour,

Une solution, certainement améliorable :

Code : Tout sélectionner

library(dplyr)
dn %>%
  lapply(function(x) as.data.frame(table(x), stringsAsFactors = FALSE)) %>%
  dplyr::bind_rows(.id = "source") %>%
  tidyr::spread(source, Freq)
PY

Guillaume Devailly
Messages : 23
Enregistré le : 22 Déc 2017, 12:31

Re: Transformer une liste de taille variable en data.frame

Messagepar Guillaume Devailly » 11 Juin 2019, 14:50

Je propose par exemple :

Code : Tout sélectionner

library(tidyverse)

gather(dn) %>% table() %>% t()
#       key
# value a b d
#     0 0 3 0
#     1 2 2 2
#     2 1 0 2
#     3 1 0 1
#     4 1 0 0

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

Re: Transformer une liste de taille variable en data.frame

Messagepar Mickael Canouil » 11 Juin 2019, 15:20

Bonjour,

voici ma proposition "pur" tidyverse:

Code : Tout sélectionner

library(tidyverse)
dn <- data.frame(a = c(1:4, 1), b = c(0, 1, 0, 0, 1), d = c(1, 2, 3, 2, 1))
dn %>%
  gather() %>%
  count(key, value) %>%
  spread(key = "key", value = "n")
#> # A tibble: 5 x 4
#> # Groups:   value [5]
#>   value     a     b     d
#>   <dbl> <int> <int> <int>
#> 1     0    NA     3    NA
#> 2     1     2     2     2
#> 3     2     1    NA     2
#> 4     3     1    NA     1
#> 5     4     1    NA    NA


On peut même jouer avec l'argument "fill" de 'spread()'

Code : Tout sélectionner

dn %>%
  gather() %>%
  count(key, value) %>%
  spread(key = "key", value = "n", fill = "0 ou NA, qu'en sais-je?")
#> # A tibble: 5 x 4
#> # Groups:   value [5]
#>   value a                      b                      d                   
#>   <dbl> <chr>                  <chr>                  <chr>               
#> 1     0 0 ou NA, qu'en sais-j… 3                      0 ou NA, qu'en sais-…
#> 2     1 2                      2                      2                   
#> 3     2 1                      0 ou NA, qu'en sais-j… 2                   
#> 4     3 1                      0 ou NA, qu'en sais-j… 1                   
#> 5     4 1                      0 ou NA, qu'en sais-j… 0 ou NA, qu'en sais-…


Cordialement,
Mickaël

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

Re: Transformer une liste de taille variable en data.frame

Messagepar Logez Maxime » 11 Juin 2019, 19:20

Bonjour,

une solution purement de base :

Code : Tout sélectionner

sapply(lapply(dn, factor, levels = 0:4), table)
  a b d
0 0 3 0
1 2 2 2
2 1 0 2
3 1 0 1
4 1 0 0
Cordialement,
Maxime


Retourner vers « Questions en cours »

Qui est en ligne

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