recodage raster

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

Adama FAYE
Messages : 22
Enregistré le : 01 Juil 2013, 23:40

recodage raster

Messagepar Adama FAYE » 10 Jan 2014, 16:05

Bonjour à tous,
Je viens vers vous pour trouver une solution à un problème que j'ai avec R. je fais de la modélisation de niche et j'aimerais faire une ACP sur mes variables climatiques pour voir celles qui sont corrélés. En ce que j'ai compris il faut faire un tableau avec en colonne les variables et en ligne les valeurs des pixels pour chaque variable. Le contenu des variables est de nlignes et ncolones, mon problème est comment additionner toutes les colonnes de ma variable à une seule colonne? Merci d'avance!

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 11 Jan 2014, 09:41

Pour quoi faire ???

Code : Tout sélectionner

> dfr <- data.frame(x = 1:5, y = 10:6)
> dfr
  x  y
1 1 10
2 2  9
3 3  8
4 4  7
5 5  6
> rowSums(dfr)
[1] 11 11 11 11 11
Renaud

Adama FAYE
Messages : 22
Enregistré le : 01 Juil 2013, 23:40

Messagepar Adama FAYE » 20 Jan 2014, 20:58

Bonjour et merci pour la réponse,
Mais mon objectif n'est pas de faire la somme des valeurs mais juste transposer les valeurs des colonnes pour avoir au finale une seule colonne.
Merci

Florent Aubry
Messages : 324
Enregistré le : 25 Juin 2010, 10:21

Messagepar Florent Aubry » 21 Jan 2014, 09:57

Si tu parles de pixels, je comprends que tes données sont sous forme d'images 2D donc de matrices. Si c'est le cas, il te suffit de concaténer selon les lignes tes matrices transformées en vecteur :

Code : Tout sélectionner

tab <- NULL
for( n.mat in 1:nb.matrices) {
   tab <- rbind( tab, acces.matrice( n.mat))
}

avec

Code : Tout sélectionner

acces.matrice <- function( no.matrice) {
  as.vector( lecture.matrice( no.matrice))
}

On peut aussi utiliser sapply si tes matrices sont dans une liste... mas il faudra alors penser à transposer le résultat.

Adama FAYE
Messages : 22
Enregistré le : 01 Juil 2013, 23:40

Messagepar Adama FAYE » 21 Jan 2014, 15:29

Salut je m'excuse je pense que j'ai pas été claire dans mon explication, j'ai une matrice de (N,M) avec N étant un nombre variable de lignes et m les colonnes. Je souhaiterai stocker les valeurs de cette matrice dans un vecteur colonne. pour le moment j'ai cette boucle sur 23 fichiers mais j'obtiens pas les vecteurs colonne au final, le résultat est toujours vide.

Code : Tout sélectionner

path<-'C:/Users/..../'# Donné le chemin d'acces du fichier source
file="bio"# Nom de chaque fichier qui sera suivit des nombre 1,2,3,4,
sortie<-"_modif"
ext<-".asc" #extension des fichiers d'entré
ncols=190#nb de colones
nrows=220#nb lignes
Header <- readLines (paste0(path,file,1,ext), n=6) #lecture du header du premmier fichier
Data<- array(dim=c(ncols,nrows,23)) #initialise une matrice (220 lignes, 190 colones)
for (i in 1:23) {   
  Data[,,i] <- as.matrix(paste0(path,file,i,ext), header=FALSE, skip=6L) #lecture de la table sans les 6 premieres lignes
  z <- 1 ## Initialize
  counter <- 1 ## Initialize
    for(y in 1:ncols) {
      for (x in 1:nrows) { 
        z[counter] <- Data[,,i][y,x]
        counter <- 1 + counter
      }
    }
cat(i,"\n")#évolution de la boucle
writeLines(Header, paste0(path,file,i,sortie,ext)) # Ecriture du header dans le fichier de sortie
#Rajouter la table
write.table (z[counter], file=paste0(path,file,i,sortie,ext), row.names=FALSE,col.names=FALSE,append = TRUE)
}

Florent Aubry
Messages : 324
Enregistré le : 25 Juin 2010, 10:21

Messagepar Florent Aubry » 21 Jan 2014, 15:55

Dans

Code : Tout sélectionner

write.table (z[counter], file=paste0(path,file,i,sortie,ext), row.names=FALSE,col.names=FALSE,append = TRUE)

z[counter] n'écrira au mieux que la dernière valeur. C'est

Code : Tout sélectionner

wtite.table( z
qu'il faut écrire.

Code : Tout sélectionner

Data[,,i] <- as.matrix( paste0(...
ne lit pas la matrice. Il manque la lecture du fichier (read.table ?), ce qui explique que ça ne marche pas.

Code : Tout sélectionner

Data[,,i][x,y]
peut s'écrire

Code : Tout sélectionner

Data[x,y,i]
mais pour ce que tu veux faire il suffit de faire :

Code : Tout sélectionner

z <- as.vector( read.table( ...
qui sauvera dans z les colonnes les unes sous les autres.

Adama FAYE
Messages : 22
Enregistré le : 01 Juil 2013, 23:40

Messagepar Adama FAYE » 21 Jan 2014, 17:03

merci pour la réponse ça m'a débloqué un coté, j'ai choisis ta derniere option z <- as.vector( read.table( ... )) et ça marche! mais j'ai un soucis pour la sauvegarde, je souhaiterai avoir toutes les colonnes de mes 23 fichiers d'entré dans un seul fichier de sorti de 23 colonnes mais j'ai toujours une seule colonne dans mon fichier de sorti. voici mon code!

Code : Tout sélectionner

path<-'C:/....../'# chemin d'acces du fichier
file="bio"# Nom de chaque fichier qui sera suivit des nombre 1,2,3,4,5
sortie<-"_modif"
ext<-".asc" #extension des fichiers d'entré
ncols=190# nligne
nrows=220#ncolone
Header <- readLines (paste0(path,file,1,ext), n=6) #lecture du header du premmier fichier
Data<- array(dim<-c(ncols,nrows,23)) #initialise la matrice (190 lignes, 220 colones)
for (i in 1:23) { # boucle 
  Data <- as.vector (t(read.table (paste0(path,file,i,ext), header=FALSE, skip=6L))) #lecture de la table
  cat(i,"\n")# évolution de la boucle
}
writeLines(Header, paste0(path,file,sortie,ext)) # Ecriture du header dans le fichier de sortie
#Rajouter la table grace a append=true
write.table (Data, file=paste0(path,file,sortie,ext), row.names=FALSE,col.names=FALSE,append =T)
#

Merci encore pour l'aide!

Florent Aubry
Messages : 324
Enregistré le : 25 Juin 2010, 10:21

Messagepar Florent Aubry » 22 Jan 2014, 10:13

En fait, il faut que tu supprimes la ligne de définition de Data et la boucle et que tu la remplaces par :

Code : Tout sélectionner

Header <- ...
Data <- sapply( 1:23, FUN=function( i) {
                        as.vector( read.table( ...)) })

Tu obtiens alors une matrice de 23 colonnes, une par fichier, et de ncols * nrows lignes où les colonnes de chacun de tes fichiers sont sauvegardées les unes sous les autres.
En effet, sapply itère sur le premier argument et passe chacune de ses valeurs à la fonction définie par l'argument FUN. Par défaut, l'argument simplify vaut TRUE, c'est-à-dire qu'il va essayer de construire une matrice, chaque colonne de la matrice étant le résultat d'une des itérations à condition que toutes les valeurs de retour soient de même type et que tous les retours soient de même longueur, sinon il retourne une liste avec une entrée par itération. Tu obtiens donc bien ce que tu veux.

Adama FAYE
Messages : 22
Enregistré le : 01 Juil 2013, 23:40

Messagepar Adama FAYE » 22 Jan 2014, 11:28

Merci beaucoup a tous, en particulier Florent Aubry, j'ai essayé ta proposition et ça marche bien, j'ai le fichier de sorti souhaité!
Merci encore!!

Adama FAYE
Messages : 22
Enregistré le : 01 Juil 2013, 23:40

Messagepar Adama FAYE » 29 Jan 2014, 09:50

J'ai remplacé les NA par la moyenne de chaque colonne dans mon jeu de données avant de faire mon ACP grace à ce code

Code : Tout sélectionner

A <- apply(A, 2, function(x) ifelse(is.na(x), mean(x,na.rm = TRUE), x))
Maintenant je souhate faire l'opération contraire i.e. remettre les NA à la place des moyennes des colonnes. Voila ou j'en suis mais ça ne marche pas

Code : Tout sélectionner

A <- apply(Al1, 2, function(x) ifelse(mean(x), (na.rm = FALSE), x))
je sollicite votre aide. Merci

Florent Aubry
Messages : 324
Enregistré le : 25 Juin 2010, 10:21

Messagepar Florent Aubry » 29 Jan 2014, 10:23

Il y a plusieurs erreurs dans ton second code :
1) le premier argument de ifelse est une valeur logique, donc un résultat de test. Par défaut, R considère comme vrai TRUE toute valeur non nulle et fausse toute valeur nulle. mean( x) ne sera considérée comme fausse que si et seulement si cette valeur vaut zéro, ce qui est pratiquement impossible compte-tenu qu'il s'agit d'un résultat de calcul. Pour utiliser une égalité approximative il faut utiliser la fonction all.equal Exemple :

Code : Tout sélectionner

all.equal( 0, 1.e-17)
ifelse( 0 == 1.e-17, TRUE, FALSE)

2) De plus, cette écriture ne fait pas ce que tu veux.
3) na.rm est un argument de la fonction mean (et d'autres fonctions) et non la valeur NA. Pour mettre un variable à celle valeur, il suffit d'écrire :

Code : Tout sélectionner

v <- NA


Pour obtenir ce que tu désires, j'utiliserai le code suivant

Code : Tout sélectionner

A.na <- is.na( A) # Tableau de logiques avec TRUE pour les cases NA
Al1[A.na] <- NA # Je mets les cases de Al1 correspondant aux 'TRUE' de A à NA


Retourner vers « Questions en cours »

Qui est en ligne

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