5 votes

Remodeler un tableau multidimensionnel

Je dispose d'un tableau représentant des données de température horaire et je souhaite calculer les maxima quotidiens (ou minima, ou moyennes). Je peux le faire en utilisant une boucle for, mais je suis sûr qu'il doit exister de nombreuses manières meilleures de le faire en R.

require(ncdf4)
nc <- nc_open('file.nc')
t2 <- ncvar_get(nc,var='T2')  # [ncols, nrows, nsteps]

Maintenant t2 est un tableau avec 744 pas de temps horaires pour un mois de 31 jours. Ce que je veux est:

t2.max[ncols, nrows, 31]

ou, de manière plus générale, je voudrais remodeler t2 en:

t2.reshape[ncols, nrows, ndays, 24]

et à partir de là, je peux utiliser la fonction apply pour calculer les moyennes quotidiennes ou les maxima ou tout ce que je veux.

Je veux que le résultat soit un tableau, pas un data frame.

Des suggestions? J'ai essayé d'utiliser melt/cast du package reshape, mais je n'ai pas réussi à comprendre comment spécifier la formule désirée.

11voto

BondedDust Points 105234

Si t2 est un tableau avec 744 pas de temps horaires pour un mois de 31 jours, alors il a 744 lignes et d'autres dimensions ? (Vous ne nous avez pas dit si ncol était de 744 ou si nrow était de 744. Nous allons supposer que c'était nrow)

 array( tc, , dim = c(31, 24, nrows, ncols) )

Si, en revanche, c'était [nrow, ncols, 744] vous pouvez utiliser aperm pour le recaster avec les lignes comme ci-dessus :

 array( aperm(tc, c(3,1,2)), dim = c(31, 24, nrows, ncols) )

Il existe un package qui a une fonction 'rowMax' et une fonction 'rowMin' qui vous permettrait d'utiliser une approche vectorisée que vous n'auriez pas besoin d'inventer. (C'était dans le package Biobase du dépôt Bioconductor.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X