Importation de data dans une matrice

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

Laurent Michelizza
Messages : 6
Enregistré le : 07 Mar 2007, 19:45

Importation de data dans une matrice

Messagepar Laurent Michelizza » 09 Mar 2007, 00:23

Bonjour,
Encore nouveau sur R, je tatonne petit a petit pour comprendre son utilisation ainsi que le langage.

Je cherche a importer du data a partir de fichiers csv de cette forme:

DateTime, Open, High, Low, Close
05/01/2007,1.30935,1.30872,1.30895,1.3089,0
05/01/2007 00:30:00,1.30895,1.30765,1.30895,1.30785,0
05/01/2007 01:00:00,1.30925,1.30792,1.308,1.30895,0
05/01/2007 01:30:00,1.30895,1.30835,1.30895,1.30855,0

Pour cela je me sert de:
symbolframe <- read.table(datafile, sep=",", header = TRUE)
datamatrix <- as.matrix(symbolframe[2:6])
rownames(datamatrix) <- as.matrix(symbolframe[1])

La date servant de nom de ligne. Le reste sous la forme d'une matrice a 5 colonnes.

Premier probleme:
J'ai essaye d'utiliser la fonction scan puis importer sous forme de matrice, mais je dois mal m'y prendre car je me retrouve avec une matrice de listes correspondant aux colonnes du fichier (bref pas ideal...))...

Deuxieme probleme:
Je stocke les dates sous ce format: 05/01/2007 00:30:00, le probleme etant que a minuit, je n'ai que la date et pas l'heure dans mes fichiers. Et les fonctions de conversion ne reconnaissent pas l'heure dans ce cas (ou alors je m'y prend mal...). Serait il mieux dans mon cas de stocker la date separee de l'heure, de cette forme: Date,Time (05/01/2007,00:30:00,..)?

Troisieme probleme:
Est ce que je devrais utiliser des tseries ou irts dans ce cas ou cela ne vous semble pas necessaire?

Merci d'avance pour vos reponses,
Laurent

E.V. Dennst

Re: Importation de data dans une matrice

Messagepar E.V. Dennst » 09 Mar 2007, 09:14

Laurent Michelizza a écrit :Bonjour,
Je cherche a importer du data a partir de fichiers csv de cette forme:
Pour cela je me sert de:
symbolframe <- read.table(datafile, sep=",", header = TRUE)

Il y a aussi read.csv() pour ne pas se casser la tête

Laurent Michelizza a écrit :Deuxieme probleme:
Je stocke les dates sous ce format: 05/01/2007 00:30:00, le probleme etant que a minuit, je n'ai que la date et pas l'heure dans mes fichiers. Et les fonctions de conversion ne reconnaissent pas l'heure dans ce cas (ou alors je m'y prend mal...). Serait il mieux dans mon cas de stocker la date separee de l'heure, de cette forme: Date,Time (05/01/2007,00:30:00,..)?

Ben, ça dépend un peu des traitements à effectuer.
Perso, je trouve commode de mettre toute la datation dans le rowname.

Pour l'histoire de l'heure de minuit manquante, un truc du genre
if (nchar(nomdecol)<10) nomdecol=paste(nomdecol,"00:00:00")
devrait faire l'affaire.

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

Messagepar Logez Maxime » 09 Mar 2007, 09:46

Bonjour,


Comme l'a souligné E.V. Dennst l'utilisation de read.csv devrait sufir en lui disant que la première valeur de chaque lig,e qu'il lit est le nom de tes lignes :

Code : Tout sélectionner

test <- read.csv("test.csv",sep=",",h=T,row.names=1)
test
                    DateTime    Open    High     Low Close
05/01/2007           1.30935 1.30872 1.30895 1.30890     0
05/01/2007 00:30:00  1.30895 1.30765 1.30895 1.30785     0
05/01/2007 01:00:00  1.30925 1.30792 1.30800 1.30895     0
05/01/2007 01:30:00  1.30895 1.30835 1.30895 1.30855     0
test <- as.matrix(test)
# pour rajouter minuit
rownames(test) <- ifelse(nchar(rownames(test))<=10,paste(rownames(test),"00:00:00",sep=" "),rownames(test))
# ou encore
rownames(test)[nchar(rownames(test))<=10] <- paste(rownames(test)[nchar(rownames(test))<=10],"00:00:00")


Maxime

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

Re: Importation de data dans une matrice

Messagepar Renaud Lancelot » 09 Mar 2007, 09:59

Laurent Michelizza a écrit :Bonjour,
Encore nouveau sur R, je tatonne petit a petit pour comprendre son utilisation ainsi que le langage.

Je cherche a importer du data a partir de fichiers csv de cette forme:

DateTime, Open, High, Low, Close
05/01/2007,1.30935,1.30872,1.30895,1.3089,0
05/01/2007 00:30:00,1.30895,1.30765,1.30895,1.30785,0
05/01/2007 01:00:00,1.30925,1.30792,1.308,1.30895,0
05/01/2007 01:30:00,1.30895,1.30835,1.30895,1.30855,0

Pour cela je me sert de:
symbolframe <- read.table(datafile, sep=",", header = TRUE)
datamatrix <- as.matrix(symbolframe[2:6])
rownames(datamatrix) <- as.matrix(symbolframe[1])

La date servant de nom de ligne. Le reste sous la forme d'une matrice a 5 colonnes.

Premier probleme:
J'ai essaye d'utiliser la fonction scan puis importer sous forme de matrice, mais je dois mal m'y prendre car je me retrouve avec une matrice de listes correspondant aux colonnes du fichier (bref pas ideal...))...


Il y a 2 pb dans votre exemple:

1. il manque un nom de colonne (dernier champ). Appelons-le X.

2. La première date n'est pas au même format que les autres ==> à corriger.

Pour la suite, j'ai sauvegardé ce jeu de données dans un fichier exemple.txt dans un de mes répertoires de travail.

DateTime, Open, High, Low, Close, X
05/01/2007 00:00:00,1.30935,1.30872,1.30895,1.3089,0
05/01/2007 00:30:00,1.30895,1.30765,1.30895,1.30785,0
05/01/2007 01:00:00,1.30925,1.30792,1.308,1.30895,0
05/01/2007 01:30:00,1.30895,1.30835,1.30895,1.30855,0

Voir l'aide de read.table (taper ?read.table) et l'argument row.names:

row.names a vector of row names. This can be a vector giving the actual row names, or a single number giving the column of the table which contains the row names, or character string giving the name of the table column containing the row names.


Donc il suffit d'écrire (en adaptant nom de fichier et de répertoire à votre cas):

Code : Tout sélectionner

> Data <- read.table("d:/analyses/travail/data/exemple.txt", sep=",", header = TRUE, row.names = 1)
> Data
                       Open    High     Low   Close X
05/01/2007          1.30935 1.30872 1.30895 1.30890 0
05/01/2007 00:30:00 1.30895 1.30765 1.30895 1.30785 0
05/01/2007 01:00:00 1.30925 1.30792 1.30800 1.30895 0
05/01/2007 01:30:00 1.30895 1.30835 1.30895 1.30855 0


pour avoir la date en nom de ligne. Mais c'est bizarre, comme idée !

Deuxieme probleme:
Je stocke les dates sous ce format: 05/01/2007 00:30:00, le probleme etant que a minuit, je n'ai que la date et pas l'heure dans mes fichiers. Et les fonctions de conversion ne reconnaissent pas l'heure dans ce cas (ou alors je m'y prend mal...). Serait il mieux dans mon cas de stocker la date separee de l'heure, de cette forme: Date,Time (05/01/2007,00:30:00,..)?


Si, vous pouvez gérer des dates sous ce format. Voir ?POSIXct et les méthodes associées (calcul de différences de dates, de séquences de dates, etc.).

Troisieme probleme:
Est ce que je devrais utiliser des tseries ou irts dans ce cas ou cela ne vous semble pas necessaire?

Merci d'avance pour vos reponses,
Laurent


Non, pas nécessaire mais ça dépend des objectifs de vos analyses. Pour ma part je laisserais la date en nom de colonne dans le jeu de données, et j'extraierais les données numériques et date en cas de besoin:

Code : Tout sélectionner

> Data <- read.table("d:/analyses/travail/data/exemple.txt", sep=",", header = TRUE)
> Data
             DateTime    Open    High     Low   Close X
1 05/01/2007 00:00:00 1.30935 1.30872 1.30895 1.30890 0
2 05/01/2007 00:30:00 1.30895 1.30765 1.30895 1.30785 0
3 05/01/2007 01:00:00 1.30925 1.30792 1.30800 1.30895 0
4 05/01/2007 01:30:00 1.30895 1.30835 1.30895 1.30855 0
> tmp <- strptime(as.character(Data[, 1]), format = "%m/%d/%Y %H:%M:%S")
> myDate <- as.POSIXct(tmp)
> myDate
[1] "2007-05-01 00:00:00 Paris, Madrid (heure d'été)" "2007-05-01 00:30:00 Paris, Madrid (heure d'été)" "2007-05-01 01:00:00 Paris, Madrid (heure d'été)"
[4] "2007-05-01 01:30:00 Paris, Madrid (heure d'été)"
> diff(myDate)
Time differences of 30, 30, 30 mins
> myData <- Data[ , -1]
> var(myData)
               Open         High           Low         Close X
Open   4.250000e-08 5.066667e-08 -3.958333e-08  8.375000e-08 0
High   5.066667e-08 2.224667e-07  7.600000e-08  1.523333e-07 0
Low   -3.958333e-08 7.600000e-08  2.256250e-07 -1.227083e-07 0
Close  8.375000e-08 1.523333e-07 -1.227083e-07  2.572917e-07 0
X      0.000000e+00 0.000000e+00  0.000000e+00  0.000000e+00 0


Renaud

E.V. Dennst

Re: Importation de data dans une matrice

Messagepar E.V. Dennst » 09 Mar 2007, 10:59

Renaud Lancelot a écrit :pour avoir la date en nom de ligne. Mais c'est bizarre, comme idée !

Ca évite d'avoir une matrice avec des types inhomogènes.
Et une matrice homogène :
1/ ça calcule plus vite,
2/ on évite les annoyances coté conversion explicites et/ou implicites

Si c'est pour faire de l'inhomogène, autant bosser avec data.frame
(et là, on est encore plus sûr de ramer !)


Oui mais j'imagine que certaine calculs sont faits sur les dates ou qu'elles servent d'axe des x dans un graphe ==> il est nécessaire qu'elles soient sous une forme exploitable ce qui n'est sûrement pas le cas en tant que nom de ligne.

Renaud

Laurent Michelizza
Messages : 6
Enregistré le : 07 Mar 2007, 19:45

Messagepar Laurent Michelizza » 09 Mar 2007, 15:15

Merci beaucoup pour vos reponses!

Super pour les dates ca m'evite de devoir recoder une partie de mon application et de modifier mes datas :-)!

Par contre, personne n'utilise scan? Il n'y a pas de gain de temps par rapport a read.table (ou .csv)?


PS: J'ai rajoute les noms de colonne a la main dans l'exemple et j'ai oublie la derniere colonne effectivement :oops: mais elle est bien presente dans mon jeu de donnees.

Laurent Michelizza
Messages : 6
Enregistré le : 07 Mar 2007, 19:45

Re: Importation de data dans une matrice

Messagepar Laurent Michelizza » 09 Mar 2007, 18:56

E.V. Dennst a écrit :
Renaud Lancelot a écrit :pour avoir la date en nom de ligne. Mais c'est bizarre, comme idée !

Ca évite d'avoir une matrice avec des types inhomogènes.
Et une matrice homogène :
1/ ça calcule plus vite,
2/ on évite les annoyances coté conversion explicites et/ou implicites

Si c'est pour faire de l'inhomogène, autant bosser avec data.frame
(et là, on est encore plus sûr de ramer !)


Oui mais j'imagine que certaine calculs sont faits sur les dates ou qu'elles servent d'axe des x dans un graphe ==> il est nécessaire qu'elles soient sous une forme exploitable ce qui n'est sûrement pas le cas en tant que nom de ligne.

Renaud


La date n'est pas si importante que ca a vrai dire... Je m'en sers tres peu, j'ai choisi ce format car je pense que les matrices ont une utilisation plus flexible que les dataframes etsont plus rapides. Je peux toujours acceder aux dates via rownames si j'en ai besoin. Peut etre cela est lent aussi?

E.V. Dennst

Re: Importation de data dans une matrice

Messagepar E.V. Dennst » 10 Mar 2007, 09:09

Laurent Michelizza a écrit :La date n'est pas si importante que ca a vrai dire... Je m'en sers tres peu, j'ai choisi ce format car je pense que les matrices ont une utilisation plus flexible que les dataframes etsont plus rapides.

oui. C'est en effet le cas (et c'est normal vu que pour une matrice homogène, il n'y a pas besoin en interne de conversion de types).

Laurent Michelizza a écrit :Je peux toujours acceder aux dates via rownames si j'en ai besoin. Peut etre cela est lent aussi?

Les rownames sont en effet là pour ça.
Mais la vitesse, c'est une question propre à l'application.
Je crois qu'il faut distinguer, entre autres, les calculs, et les sorties graphiques et choisir le format de stockage des data le plus approprié selon qu'on fait plus de calculs ou plus de sorties.

E.V. Dennst

Re: Importation de data dans une matrice

Messagepar E.V. Dennst » 10 Mar 2007, 09:20

Renaud Lancelot a écrit :Oui mais j'imagine que certaine calculs sont faits sur les dates ou qu'elles servent d'axe des x dans un graphe ==> il est nécessaire qu'elles soient sous une forme exploitable ce qui n'est sûrement pas le cas en tant que nom de ligne.
Renaud


(Il y a eu un petit micmac sur ce post ;-))

Les rownames peuvent très bien avoir un type date, isodate, etc tout à fait exploitable. Au pire on fait une conversion sur cette *unique* colonne au moment voulu.
C'est toujours mieux que d'avoir une colonne unique et spécifique dans la matrice, mais qui s'impose comme un cheveu sur la soupe, dans tous les calculs qui concernent l'ensemble de la matrice.
Bon, mais tout ça dépend bien sûr de l'appli et de la matrice.
100000x30 ou 100x3, c'est pas pareil.
Bon we à tous.

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

Messagepar Renaud Lancelot » 10 Mar 2007, 13:41

Oui, désolé pour le micmac. Je pense qu'il y a un pb avec l'option "Citer" qui en fait édite le message. Cela m'est arrivé une ou deux fois sur d'autres messages. Mea culpa.

Les rownames sont des noms et on ne peut pas faire d'opérations directement dessus autres que celles valides sur des chaînes de caractères. D'après l'aide de ?rownames:

For a data frame, value for rownames should be a character vector of non-duplicated and non-missing names (this is enforced), and for colnames a character vector of (preferably) unique syntactically-valid names. In both cases, value will be coerced by as.character.


Je pensais (à tort) que dans l'exemple de Laurent, la date et l'heure, devaient être stockées sous une forme exploitable en tant que telle, d'où l'idée de les mettre dans un vecteur d'un data.frame. Cela a bcp d'avantages dans la mesure où il y a bcp de méthodes adaptées aux dates, y compris pour tracer les axes d'un graphe. Je m'en sers souvent.

Renaud

Laurent Michelizza
Messages : 6
Enregistré le : 07 Mar 2007, 19:45

Messagepar Laurent Michelizza » 10 Mar 2007, 19:09

J'ai en effet plus besoin de faire des calculs sur les colonnes que des sorties graphiques.

Donc je pense m'en tenir a ce format pour l'instant :).

En tout cas merci beaucoup pour vos reponses!

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

Messagepar Logez Maxime » 11 Mar 2007, 22:10

Bonjour,


L'utisation de la fonction scan est très intéressante à mon avis quand tu disposes d'un jeu de données très volumineux et qui est homogène dans la nature des donénes : toutes numériques ou toutes des chaînes de caractères ... pour la création d'un matrice.

Code : Tout sélectionner

test <- as.matrix(scan(file="test.txt",what=double(0), sep="\t",skip=1),ncol=...,nrow=...,byrow=TRUE)

Si dans ton fichier contient des réels et sur la première ligne le nom des colonnes, mais c'est vrai que le temps d'import des données dans R est réduit. Mais don ton cas je ne sais pas si c'est réellement adapté du fait que tu as un mélange de date et de nombre, à voir.

Maxime


Retourner vers « Questions en cours »

Qui est en ligne

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