dataframe 3D

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

Stephan Defoy
Messages : 59
Enregistré le : 19 Déc 2019, 14:07

dataframe 3D

Messagepar Stephan Defoy » 06 Avr 2020, 09:52

Bonjour,

Je souhaiterais réaliser un dataframe en 3 dimensions, ou un dataframe de dataframe, pouvez-vous me dire si cela est possible ?
Je crains que non, car je n'ai rien vu de tel sur les divers sites.
Merci d'avance,

Fred Santos
Messages : 233
Enregistré le : 11 Avr 2009, 10:00
Contact :

Re: dataframe 3D

Messagepar Fred Santos » 06 Avr 2020, 11:53

Bonjour,
Une structure approchant (imparfaitement) votre requête serait la structure array, mais contrairement aux dataframes elle ne gère pas de variables de types hétérogènes.
Une autre possibilité serait de faire simplement une liste de dataframes. (Je ne sais pas à quoi pourrait ressembler "un dataframe de dataframes", c'est en tout cas différent de l'idée de dataframe 3d.)
Quelles seraient les données destinées à être stockées dans cette structure, grosso modo ?

Stephan Defoy
Messages : 59
Enregistré le : 19 Déc 2019, 14:07

Re: dataframe 3D

Messagepar Stephan Defoy » 06 Avr 2020, 12:14

En fait, j'ai 14 stations MTO qui me donnent plusieurs paramètres sur 30 ans, je souhaiterais stocker mes données par mois et par station.
J'espère que je suis assez claire sinon, n'hésitez pas,

Merci encore pour votre aide,

Stephan Defoy
Messages : 59
Enregistré le : 19 Déc 2019, 14:07

Re: dataframe 3D

Messagepar Stephan Defoy » 06 Avr 2020, 12:20

Je peux essayer de faire un dataframe de dataframe mensuel, ça résoudrait mon souci, si ca fonctionne,

Stephan Defoy
Messages : 59
Enregistré le : 19 Déc 2019, 14:07

Re: dataframe 3D

Messagepar Stephan Defoy » 06 Avr 2020, 12:56

Jai mon fichier initial :

Code : Tout sélectionner

head(don_dat3)
        date    T   Td      T1     Td1      T2     Td2      T3     Td3      T4
1 1990010100 21.8 20.6 295.805 290.980 295.622 290.773 295.630 290.311 295.770
2 1990010103 20.3 19.0 294.284 289.481 294.426 289.012 295.245 288.278 294.690
3 1990010106 19.1 16.2 294.421 289.231 294.513 288.075 294.568 286.928 294.386
4 1990010109 22.4 13.9 295.162 288.059 295.428 286.604 296.391 284.360 296.127
8 1990010121 24.1 15.0 297.290 285.680 297.663 285.463 297.321 286.873 296.965
9 1990010200 20.3 16.0 294.328 285.368 294.547 285.263 294.811 285.052 294.651
      Td4
1 290.570
2 288.938
3 288.362
4 285.842
8 287.059
9 285.116


Et je souhaiterais, le transformer en un data-frame de data-frame.
J'ai essayé entre autres ceci mais sans succès ...
don_dat4[,,1]=(don_dat3)
Voici le résultat :

Code : Tout sélectionner

head(don_dat4)
  substr.don_dat3.date..1..4.
1                  1990010100
2                  1990010103
3                  1990010106
4                  1990010109
5                  1990010121
6                  1990010200

François Bonnot
Messages : 537
Enregistré le : 10 Nov 2004, 15:19
Contact :

Re: dataframe 3D

Messagepar François Bonnot » 06 Avr 2020, 13:52

Bonjour,
Une solution poutrrait être une liste de data frames, par exemple :

Code : Tout sélectionner

df1 <- data.frame(x=1:3, y=letters[1:3])
df2 <- data.frame(u=(1:3)*10, y=LETTERS[1:3])
li <- list(df1,df2)
li
li[[2]][3,1]
François

Stephan Defoy
Messages : 59
Enregistré le : 19 Déc 2019, 14:07

Re: dataframe 3D

Messagepar Stephan Defoy » 07 Avr 2020, 07:55

Merci bien François, je n'avais pas vu ton message hier et j'avais du mal à m'en sortir tout seul !!

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

Re: dataframe 3D

Messagepar Pierre-Yves Berrard » 07 Avr 2020, 09:37

Bonjour,

R autorise à mettre "n'importe quoi" dans un data.frame (à condition que ce n'importe quoi contienne le même nombre d'éléments que le nombre de lignes du data.frame).

On peut en particulier mettre un data.frame dans une "case" d'un autre data.frame.

Voir par exemple la fonction nest() du package tidyr, ou plus généralement ce qu'on appelle les colonnes-list (list-columns en anglais).
PY

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

Re: dataframe 3D

Messagepar Logez Maxime » 07 Avr 2020, 10:00

Bonjour,

si les données sont numériques alors l'array est pleinement adapté à la question.
Tu peux même envisager de le stocker ensuite dans un fichier netcdf, ce qui te permettra de n'importer qu'une partie de tes données relativement facilement ou de le mettre à jour au fur et à mesure des nouvelles données entrantes.
C'est typiquement ce genre de structure de données qui est utilisée pour stocker des données climatiques par exemple.

Cordialement,
Maxime

Stephan Defoy
Messages : 59
Enregistré le : 19 Déc 2019, 14:07

Re: dataframe 3D

Messagepar Stephan Defoy » 07 Avr 2020, 10:17

Ok, merci bien car oui j'ai bien des données numériques, je regarde la fonction array car je n'ai pas le package tidyr.

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

Re: dataframe 3D

Messagepar Logez Maxime » 07 Avr 2020, 11:24

Stephan Defoy a écrit :Ok, merci bien car oui j'ai bien des données numériques, je regarde la fonction array car je n'ai pas le package tidyr.

Alors le array sera parfait, il faut juste bien identifier ce que tu mets derrière chaque dimension. L'array étant un objet de base tu n'as pas besoin de librairies additionnelles et ça sera beaucoup plus léger en mémoire que des data.frame.

Cordialement,
Maxime

Stephan Defoy
Messages : 59
Enregistré le : 19 Déc 2019, 14:07

Re: dataframe 3D

Messagepar Stephan Defoy » 07 Avr 2020, 12:40

Entendu, merci bien, je me suis donc lancé dans cette direction en effet, mais j'ai encore un petit souci.
J'ai mon data-frame initial :

Code : Tout sélectionner

head(data_an)
         T      T3
23099 17.4 293.704
23100 20.8 295.091
23101 28.8 303.429
23102 31.8 305.603
23103 29.1 302.498
23104 15.8 293.579

Je veux le mettre dans une matrice, type array, ma première dimension correspond au nombre de ligne, et ma dernière dimension correspond au nombre de mes stations :

Code : Tout sélectionner

data=array(data_an,dim = c(2773, 7, 14),dimnames=list(seq(1:2773),letters[1:7],LETTERS[1:14]))

J'ai bien un tableau à 3 dimensions :

Code : Tout sélectionner

dim(data)
[1] 2773    7   14

Mais je n'arrive pas à visualiser mon data-frame initial en faisant :

Code : Tout sélectionner

 head(data$A)
NULL

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

Re: dataframe 3D

Messagepar Logez Maxime » 07 Avr 2020, 12:46

re,

le '$' ne sert que pour les objets de types liste ou data.frame. Le array est un vecteur à n dimension, il fonctionne comme une matrice au niveau des indexations.
Dans ton cas ça serait quelque chose comme :

Code : Tout sélectionner

data[, , "A"]
.
Puisque c'est la troisième dimension qui comporte les lettres majuscules. La première virgule sépare la première de la deuxième dimension, la deuxième virgule sépare la deuxième de la troisième dimension, etc.

Cordialement,
Maxime


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité