read.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

Couanais Pierre
Messages : 213
Enregistré le : 26 Fév 2007, 12:41

read.table

Messagepar Couanais Pierre » 26 Avr 2007, 10:26

Bonjour à tous,

Non expert en R, ma question va peut etre vous paraitre fort simple :

j'aimerais creer un tableau sous R à partir d'un fichier texte d'environ 10 000 lignes et de nombre de colonnes inconnu. En effet mon fichier texte est (en gros) comme ceci :

A~B~B
A~C

A~B~C~A~B~B
A~B~C~A~B~B~A~B~B
A~D

etc....

il peut donc contenir des lignes blanches et mon séparateur va donc être ~.

Mais mon pb est que même en mettant les options "fill=TRUE,blank.lines.skip=FALSE", R ne me crée pas le tableau souhaité avec en nombre de colonnes le nombre maximal de données possibles sur une quelconque ligne.

En résumé, j'aimerais que mon tableau R soit un n*p avec n le nombre de lignes comprenant même les lignes vides, et p le nombre maximal de données rencontrées sur une ligne. Les lignes n'ayant pas p valeurs sont complétées par des NA (ou autre...)

Est ce possible? Ai je été clair?

Merci d'avance

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

Messagepar Logez Maxime » 26 Avr 2007, 11:25

Bonjour,

Pourquoi ne pas ouvrir ce fichier dans Excel avec pour délimiteur "~" de l'enregistrer en txt avce séparteur tabulation et de l'incorporer dans R avec read.table("nom du fichier.txt",sep="\t") ? je l'ai testé sur le pettit nombre de lignes que tu as envoyé et ça marche très bien.

Maxime

Couanais Pierre
Messages : 213
Enregistré le : 26 Fév 2007, 12:41

Messagepar Couanais Pierre » 26 Avr 2007, 11:56

En réalité mon fichier d'origine est un fichier excel : le pb, c'est que le nombre max de colonnes sur Excel est 256, et que j'ai des lignes avec plus de 256 données!

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

Messagepar Logez Maxime » 26 Avr 2007, 12:30

Re,


Ouai un problème des plus classiques avec office ... Bon je le code suivant est pas très "propre" mais devrait te permettre quand même d'incoporer ton tableau avec tes différences dans les nombres de valeurs par lignes.

Code : Tout sélectionner

tab <- readLines("read2.txt") # pour lire les lignes du fichierread2.txt
tab <- strsplit(tab,"\t") # pour récupérer les valeurs
n <- max(unlist(lapply(tab,length))) # pour savoir combien de valeurs au maximum tu as par ligne
tab <- lapply(tab,function(x)
{
if(length(x)<n) x <- c(x,rep("",n-length(x)))
else
x
return(x)
}
)
tab <- do.call("rbind",tab)
tab
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] "A"  "B"  "B"  ""   ""   ""   ""   ""   "" 
[2,] "A"  "C"  ""   ""   ""   ""   ""   ""   "" 
[3,] ""   ""   ""   ""   ""   ""   ""   ""   "" 
[4,] "A"  "B"  "C"  "A"  "B"  "B"  ""   ""   "" 
[5,] "A"  "B"  "C"  "A"  "B"  "B"  "A"  "B"  "B"
[6,] "A"  "D"  ""   ""   ""   ""   ""   ""   ""


Avec pour fichier de départ les premières lignes que tu as données.

Maxime

Couanais Pierre
Messages : 213
Enregistré le : 26 Fév 2007, 12:41

Messagepar Couanais Pierre » 26 Avr 2007, 12:41

Ecoute je tente ça merci Maxime en tout cas!

Je te tiens au courant...

Couanais Pierre
Messages : 213
Enregistré le : 26 Fév 2007, 12:41

Messagepar Couanais Pierre » 26 Avr 2007, 15:32

En appliquant exactement ton code Maxime, je me retrouve avec un tableau d'une seule colonne... avec toutes mes données conservées dans une cellule avec ~comme séparateur...


Sinon, est ce possible de trouver la ligne qui a le plus de données, coder
"dates=read.table("dates.txt",sep="~",fill=TRUE,blank.lines.skip=FALSE)"

par exemple et avoir un tableau ou les blancs sont remplacés par des NA..c'est pas très pratique mais apparemment ca marche non?

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

Messagepar Logez Maxime » 26 Avr 2007, 15:43

Re,

Je ne sais pas si ça marcherait car tes lignes ne contiennent pas le même nombre de valeurs si tu prends pour séparateur "~". En tout cas chez moi ça plante. Tu peux essayé ça aussi :

Code : Tout sélectionner

tab <- scan("read.txt","character",blank.lines.skip = FALSE)
tab <- strsplit(tab,"~")
n <- max(unlist(lapply(tab,length)))
tab <- lapply(tab,function(x)
{
if(length(x)<n) x <- c(x,rep(NA,n-length(x)))
else
x
return(x)
}
)
tab <- do.call("rbind",tab)
tab
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] "A"  "B"  "B"  NA   NA   NA   NA   NA   NA 
[2,] "A"  "C"  NA   NA   NA   NA   NA   NA   NA 
[3,] NA   NA   NA   NA   NA   NA   NA   NA   NA 
[4,] "A"  "B"  "C"  "A"  "B"  "B"  NA   NA   NA 
[5,] "A"  "B"  "C"  "A"  "B"  "B"  "A"  "B"  "B"
[6,] "A"  "D"  NA   NA   NA   NA   NA   NA   NA


Chez moi ça marche. A toi de voir. Je pense que pour utiliser un read.table il faut que les lignes est le même nombre de valeurs, ce qui n'est pas ton cas avec un séparateur "~". Par contre tu peux très bien remplacer la ligne avec scan par read.table mais en ne précisant pas de séparateur.

La fonction scan a un autre avantage par rapport à la fonction read.table : son temps d'éxecution. D'autant plus apréciable que le tableau a incorporer est grand.

Maxime

Couanais Pierre
Messages : 213
Enregistré le : 26 Fév 2007, 12:41

Messagepar Couanais Pierre » 26 Avr 2007, 15:53

OK j'essaie merci.

Ce que je voulais dire (j'ai oublié de le préciser) c'est chercher la ligne avec le + de données et la mettre en 1er....

La ca marche nan? meme si pour la suite j'ai encore quelques soucis!

Mais je tente ton code

Encore merci

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

Messagepar Logez Maxime » 26 Avr 2007, 15:56

Re,

Non ça ne marchera pas car ce qui compte c'est que tes lignes ont le même nombre de valeurs ...

Maxime

Couanais Pierre
Messages : 213
Enregistré le : 26 Fév 2007, 12:41

Messagepar Couanais Pierre » 26 Avr 2007, 16:28

Ben ecoute je pars sur ton code alors merci... Ca m'a l'air de tout à fait bien marcher!

Même si je persiste : en mettant la + grande ligne en premier ca fonctionne j'ai tenté... mais c'est plus propre ce que tu proposes merci!

Bon j'avance en tout cas et si j'ai encore un petit pb, je te redemanderai :)

Merci encore

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

Messagepar Logez Maxime » 26 Avr 2007, 16:35

Re,

est-ce que tu peux me dire le code que tu emploies lorsque tu mets la ligne la plus longue en premier parce que moi ça me donne ça :

Code : Tout sélectionner

read.table("read.txt",sep="~")
Erreur dans scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
        la ligne 2 n'avait pas 9 éléments
De plus : Warning message:
readTableHeader a trouvé une ligne finale incomplète dans 'read.txt'


Maxime

Couanais Pierre
Messages : 213
Enregistré le : 26 Fév 2007, 12:41

Messagepar Couanais Pierre » 26 Avr 2007, 16:38

Wep,

je mets ça :

dates2=read.table("dates.txt",sep="~",na.strings=0,fill=TRUE,blank.lines.skip=FALSE)

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

Messagepar Logez Maxime » 26 Avr 2007, 17:47

Re,


Du coup je pense que le code que je t'ai envoyé deviens obsolette incorpore ton tableau de cette manière et pour changer les "" en NA tu n'as qu'a faire dates2[date2==""] <- NA.
Le seul intérêt de mon code est de ne pas s'embêter a chercher la ligne la plus longue et de la mettre en premier.

Maxime

On a tous a apprendre des autres.

Couanais Pierre
Messages : 213
Enregistré le : 26 Fév 2007, 12:41

Messagepar Couanais Pierre » 27 Avr 2007, 08:59

ben perso je prefere le tien car je peux mettre des 0 à la place des NA, tout convertir en numérique et ensuite faire un while pour récuperer l'indice du dernier "vrai" élément (jusqu'au premier 0) de chaque ligne!!

et avec mon code je n'y arrivais pas...

Couanais Pierre
Messages : 213
Enregistré le : 26 Fév 2007, 12:41

Messagepar Couanais Pierre » 27 Avr 2007, 09:57

ah ben non avec ton code non + j'y arrive pas en fait... :cry:

tu sais comment faire, tout en gardant mon code, pour changer les NA en 0 (par exemple) pour pouvoir faire un while ensuite ?

Car j'arrive pas à faire de test sur les NA la!


Retourner vers « Questions en cours »

Qui est en ligne

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