Pivoter table

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

Kévin Dubois
Messages : 97
Enregistré le : 25 Mar 2019, 12:07

Pivoter table

Messagepar Kévin Dubois » 07 Jan 2021, 18:27

Bonjour,

Je dispose d'une table qui indique l'appartenance d'un individus statistique à un groupe (valeur booléenne), suivant 2 année de référence, et une variable de cout.

https://zupimages.net/viewer.php?id=21/01/0cim.png

Je souhaiterais créer un tableau croisé dynamique, qui ferait la somme de la variable de cout, en fonction du changement observé entre les 2 années dans la variable d'appartenance à un groupe. L'idée, c'est d'arriver à ce résultat :

https://zupimages.net/viewer.php?id=21/01/iw5u.png

Voici un code reproductible :

Code : Tout sélectionner

data = data.frame(id_ind = c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6), annee = c(2006, 2018,2006, 2018,2006, 2018,2006, 2018,2006, 2018,2006, 2018), cout = c(15.02, 14.06, 22.52, 20.89, 25.46, 28.39, 21.45, 12.41, 1.23, 10.25, 36.22, 14.65), appartenance = c('0', '0', '0', '1', '1', '1', '1', '1', '0', '1', '0', '1'))


Est-il possible de faire cela ?

Merci.

Sébastien Rochette
Messages : 54
Enregistré le : 03 Juil 2020, 12:43
Contact :

Re: Pivoter table

Messagepar Sébastien Rochette » 07 Jan 2021, 20:14

Bonjour,
J'ai envie de dire que c'est possible, mais je n'ai pas compris exactement ce que vous vouliez...
Les images ne correspondent pas au tableau d'exemple que vous avez donné. Du coup, je ne vois pas d'où viennent les 0/1 en ligne et ceux en colonne. Ainsi que ce que représente les chiffres aux intersections.

Pouvez-vous préciser en utilisant les mêmes noms de variables ?
Sébastien
Dev, Consult, Formateur
ThinkR

Kévin Dubois
Messages : 97
Enregistré le : 25 Mar 2019, 12:07

Re: Pivoter table

Messagepar Kévin Dubois » 07 Jan 2021, 20:39

Merci pour votre réponse.

Concrètement, la variable "appartenance" est une variable booléenne qui indique pour chaque carreau et année, une appartenance ou pas à un changement d'état. Je souhaite simplement créer une matrice de changement d'état en pondérant par la variable cout.

Dans l'image "Résultat" que j'ai envoyé, on retrouve :
- [0,0] = 25, car seul l'individus statistique ayant l'identifiant 1 possèdent une valeur 0 aux années 2006 et 2018. J'écris donc la valeur de sa colonne "Cout" qui est égale à 25.
- [0,1] = 106, car ce sont les individus statistiques ayant l'identifiant 2, 5, et 6 qui possèdent une valeur à 0 pour 2006 et 1 pour 2018. Je somme donc leur valeur de la variable cout : 14 + 36 + 56 = 106.
- [1,0] = 0, car aucun individus statistique ne possède de valeur à 1 pour 2006 et 0 pour 2018.
- [1,1] = 30, car ce sont les individus statistiques ayant l'identifiant 3 et 4 qui possèdent une valeur à 1 pour 2006 et 1 pour 2018, donc on somme leur cout : 12 + 18 = 30.

Merci.

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

Re: Pivoter table

Messagepar Pierre-Yves Berrard » 08 Jan 2021, 00:30

Pour info, vous pouvez utiliser les balises [img] pour faire afficher les images :

Code : Tout sélectionner

[img]https://zupimages.net/up/21/01/iw5u.png[/img]
affichera
Image
PY

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

Re: Pivoter table

Messagepar Pierre-Yves Berrard » 08 Jan 2021, 08:24

De plus, les données ne correspondent pas à ce qu'il y a dans les images (colonne coût). Merci d'éditer votre message d'origine.
PY

Sébastien Rochette
Messages : 54
Enregistré le : 03 Juil 2020, 12:43
Contact :

Re: Pivoter table

Messagepar Sébastien Rochette » 08 Jan 2021, 09:40

Bonjour,
Voici le code qui doit correspondre à ce que vous voulez.
La prochaine fois, merci de proposer un jeu de données test qui correspond à votre demande. Je l'ai modifié.

Code : Tout sélectionner

library(dplyr)
library(tidyr)

data <- data.frame(
  id_carreau = c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6),
  annee = c(2006, 2018,2006, 2018,2006, 2018,2006, 2018,2006, 2018,2006, 2018),
  appartenance = c('0', '0', '0', '1', '1', '1', '1', '1', '0', '1', '0', '1'),
  cout = round(c(15.02, 14.06, 22.52, 20.89, 25.46, 28.39, 21.45, 12.41, 1.23, 10.25, 36.22, 14.65))
)
data

# Sum par groupe
data_sum_tidy <- data %>%
  group_by(id_carreau, appartenance) %>%
  summarise(sum_cout = sum(cout), .groups = "drop")
data_sum_tidy

# Pivot
data_sum_non_tidy <- data_sum_tidy %>%
  pivot_wider(names_from = appartenance, values_from = sum_cout)
data_sum_non_tidy
Sébastien
Dev, Consult, Formateur
ThinkR

Kévin Dubois
Messages : 97
Enregistré le : 25 Mar 2019, 12:07

Re: Pivoter table

Messagepar Kévin Dubois » 08 Jan 2021, 09:47

Un grand merci.

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

Re: Pivoter table

Messagepar Logez Maxime » 08 Jan 2021, 13:36

Bonjour,

si j'ai bien compris voici une alternative possible :

Code : Tout sélectionner

xtabs(cout ~ id_carreau+appartenance, data)
.

Cordialement,
Maxime

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

Re: Pivoter table

Messagepar Mickael Canouil » 08 Jan 2021, 15:51

@Maxime stats::xtabs est pas mal ;) (dans le cas ou la fonction d'aggrégation est l'addition).

Sinon, avec "reshape2":

Code : Tout sélectionner

reshape2::dcast(
  data = data,
  formula = id_carreau ~ appartenance,
  fun.aggregate = sum,
  value.var = "cout"
)
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

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