export import 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

Marchand Marc-Antoine
Messages : 9
Enregistré le : 22 Oct 2018, 10:33

export import data frame

Messagepar Marchand Marc-Antoine » 11 Fév 2019, 16:11

Bonjour,

je créé un data frame avec 1 600 759 lignes que j'exporte en .txt. Mais quand je l'importe je n'ai que 338601 lignes...

voici mon code (voir surtout la fin après la boucle for) :

Code : Tout sélectionner


maillage<-"maillage_2"
nom_obs<-"obs.txt"

gp_tax<-list("amphibiens","arachnides","autres invertébrés",
"chiroptères","coléoptères","crustacés",
"hémiptères","hétérocères","mammifères hors chiroptères",
"mollusques","névroptères","odonates",
"reptiles","oiseaux",
"orthoptères","rhopalocères","poissons")

gp_tax<-as.character(gp_tax)

lst_tot<-NULL

for (i in 1:length(gp_tax)){

setwd(dir="C:/Users/Marc-Antoine/OneDrive - CEN PACA/autres missions/strategie_metropole_aix/version_1")
setwd(maillage)
setwd(gp_tax[i])
lst<-read.delim(nom_obs, header=TRUE, dec=".", sep="\t",stringsAsFactors=FALSE)

lst_tot<-rbind(lst_tot,lst)

}

dim(lst_tot)
# j'obtiens 1600759

setwd(dir="C:/Users/Marc-Antoine/OneDrive - CEN PACA/autres missions/strategie_metropole_aix/version_1")
setwd(maillage)

write.table(lst_tot, file=paste("faune/obs.txt", sep=''), sep="\t", row.names=FALSE)

faune<-read.delim(nom_obs, header=TRUE, dec=".", sep="\t",stringsAsFactors=FALSE)
dim(faune)
#j'obtiens 338601



J'ai essayé avec read.csv2() et write.csv2() et ça marche (nombre de lignes conservés) et la taille du fichier est la même que ce soit en .csv ou en .txt donc je présume que le problème vient de read.delim()... Toutefois j'utilise ensuite ces fichiers dans plein d'autres scripts et du coup ça me demande de faire pas mal de modifs si je dois passer en .csv...

Si quelqu'un a une idée ?

Merci

Marco

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

Re: export import data frame

Messagepar Mickael Canouil » 11 Fév 2019, 16:39

Bonjour,

Concrètement votre problème vient des arguments mal spécifiés dans read.delim.
Et plus généralement de la localisation des fichiers (le code n'est pas des plus reproductible pour le garantir).

Ceci étant dit, il y a d'autres problèmes dans votre code (malgré le fait que ce soit "fonctionnel"), par exemple ceci:

Code : Tout sélectionner

setwd(dir="C:/Users/Marc-Antoine/OneDrive - CEN PACA/autres missions/strategie_metropole_aix/version_1")
setwd(maillage)
setwd(gp_tax[i])

setwd ne s'utilise pas pour "naviguer" dans les répertoires et ne devrait absolument jamais être utilisé de cette façon.

ou encore une boucle for avec incrémentation du résultat, surtout que vous parlez de plusieurs centaines de milliers de lignes, ce qui constitue le pire cas d'utilisation de la boucle for...

Code : Tout sélectionner

lst_tot<-NULL
for (i in 1:length(gp_tax)){
lst<-read.delim(nom_obs, header=TRUE, dec=".", sep="\t",stringsAsFactors=FALSE)
lst_tot<-rbind(lst_tot,lst)
}


La code suivant se simplifie:

Code : Tout sélectionner

gp_tax<-list("amphibiens","arachnides","autres invertébrés",
"chiroptères","coléoptères","crustacés",
"hémiptères","hétérocères","mammifères hors chiroptères",
"mollusques","névroptères","odonates",
"reptiles","oiseaux",
"orthoptères","rhopalocères","poissons")

gp_tax<-as.character(gp_tax)

en:

Code : Tout sélectionner

gp_tax<-c(
  "amphibiens", "arachnides", "autres invertébrés",
  "chiroptères", "coléoptères", "crustacés",
  "hémiptères", "hétérocères", "mammifères hors chiroptères",
  "mollusques", "névroptères", "odonates",
  "reptiles", "oiseaux",
  "orthoptères", "rhopalocères", "poissons"
 )


Voici un exemple de code plus "propre"

Code : Tout sélectionner

### Définition du dossier principal
home_directory <- "C:/Users/Marc-Antoine/OneDrive - CEN PACA/autres missions/strategie_metropole_aix/version_1"

### Définition d'un sous dossier
maillage_directory <- paste0(home_directory, "/maillage_2")

### Liste les fichiers "obs.txt" de façon récursive dans les sous-dossiers de "maillage_directory"
# gp_tax <- list.files(path = maillage_directory, pattern = "obs.txt", recursive = TRUE, full.names = TRUE) # ici vous écrivez aussi dans faune qui est un sous répertoire, donc à éviter...
# list_tables <- lapply(X = gp_tax, FUN = read.delim, header = TRUE, sep = "\t", stringsAsFactors = FALSE) # pour lire tous les fichiers listé

### Lecture des fichiers des dossiers de gp_tax et stockage dans une liste
gp_tax<-c(
  "amphibiens", "arachnides", "autres invertébrés",
  "chiroptères", "coléoptères", "crustacés",
  "hémiptères", "hétérocères", "mammifères hors chiroptères",
  "mollusques", "névroptères", "odonates",
  "reptiles", "oiseaux",
  "orthoptères", "rhopalocères", "poissons"
)
 
list_tables <- lapply(X = gp_tax, FUN = function(itax) {
  read.delim(
    file = paste(maillage_directory, itax, "obs.txt", sep = "/"),
    header = TRUE,
    sep = "\t",
    stringsAsFactors = FALSE
  )
}

### Concatène les éléments de la liste pour en faire un gros tableau
big_table <- do.call("rbind", list_tables)

### Ecrit le tableau dans le dossier "faune" (encore faut-il qu'il existe) dans un fichier nommé "obst.txt"
write.table(big_table, file = paste0(maillage_directory, "/faune/obs.txt"), sep = "\t", row.names = FALSE)

### Lecture du tableau
faune <- read.delim(file = paste0(maillage_directory, "/faune/obs.txt"), header = TRUE, sep = "\t", stringsAsFactors = FALSE)


Une petite suggestion de lecture: https://irudnyts.github.io/r-coding-style-guide/

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Marchand Marc-Antoine
Messages : 9
Enregistré le : 22 Oct 2018, 10:33

Re: export import data frame

Messagepar Marchand Marc-Antoine » 12 Fév 2019, 09:59

Bonjour,

Merci beaucoup pour cette réponse qui va m'aider et éclaircir pas mal de choses au delà du problème posté :-)

J'ai pu résoudre mon problème en spécifiant : quote = ""
dans : read.delim()

je remet le code au cas ou (quelques parenthèses manquantes et un nom d'objet erroné :-) )

Encore merci beaucoup

Marco


Code : Tout sélectionner

### Définition du dossier principal
home_directory <- "C:/Users/Marc-Antoine/OneDrive - CEN PACA/autres missions/strategie_metropole_aix/version_1"

### Définition d'un sous dossier
maillage_directory <- paste0(home_directory, "/maillage_2")

### Liste les fichiers "obs.txt" de façon récursive dans les sous-dossiers de "maillage_directory"
# gp_tax <- list.files(path = maillage_directory, pattern = "obs.txt", recursive = TRUE, full.names = TRUE) # ici vous écrivez aussi dans faune qui est un sous répertoire, donc à éviter...
# list_tables <- lapply(X = gp_tax, FUN = read.delim, header = TRUE, sep = "\t", stringsAsFactors = FALSE) # pour lire tous les fichiers listé

### Lecture des fichiers des dossiers de gp_tax et stockage dans une liste
gp_tax<-c(
  "amphibiens", "arachnides", "autres invertébrés",
  "chiroptères", "coléoptères", "crustacés",
  "hémiptères", "hétérocères", "mammifères hors chiroptères",
  "mollusques", "névroptères", "odonates",
  "reptiles", "oiseaux",
  "orthoptères", "rhopalocères", "poissons")
 
list_tables <- lapply(X = gp_tax, FUN = function(glagla) {
  read.delim(
    file = paste(maillage_directory, glagla, "obs.txt", sep = "/"),
    header = TRUE,
    sep = "\t",
    stringsAsFactors = FALSE
  )
}
)

### Concatène les éléments de la liste pour en faire un gros tableau
big_table <- do.call("rbind", list_tables)

dim(big_table)

### Ecrit le tableau dans le dossier "faune" (encore faut-il qu'il existe) dans un fichier nommé "obst.txt"
write.table(big_table, file = paste0(maillage_directory, "/faune_2/obs.txt"), sep = "\t", row.names = FALSE)

### Lecture du tableau
faune <- read.delim(file = paste0(maillage_directory, "/faune_2/obs.txt"), header = TRUE, sep = "\t",quote="")



Retourner vers « Questions en cours »

Qui est en ligne

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