[Résolu] Format as.Date avec cbind

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

Laëtitia VIBERT
Messages : 42
Enregistré le : 16 Avr 2019, 10:13

[Résolu] Format as.Date avec cbind

Messagepar Laëtitia VIBERT » 21 Mai 2019, 08:30

Bonjour,
j'ai un soucis dans un de mes scripts : je cherche à remplir un df de 4 colonnes (id de l'indiv, n° de l'événement, date et fichier correspondant) comportant tous les fichiers quotidiens (raster et date) compris entre 2 dates.

J'ai pour cela une liste appelée "dates", qui comporte les dates des fichiers, dates allant de 2017-12-01 à 2019-02-15

Code : Tout sélectionner

dates <- structure(c(17501, 17502, 17503, 17504, 17505, 17506, 17507,
+                      17508, 17509, 17510, 17511, 17512, 17513, 17514, 17515, 17516,
+                      17517, 17518, 17519, 17520, 17521, 17522, 17523, 17524, 17525,
+                      17526, 17527, 17528, 17529, 17530, 17531, 17532, 17533, 17534,
+                      17535, 17536, 17537, 17538, 17539, 17540, 17541, 17542, 17543,
+                      17544, 17545, 17546, 17547, 17548, 17549, 17550, 17551, 17552,
+                      17553, 17554, 17555, 17556, 17557, 17558, 17559, 17560, 17561,
+                      17562, 17563, 17564, 17565, 17566, 17567, 17568, 17569, 17570,
+                      17571, 17572, 17573, 17574, 17575, 17576, 17577, 17866, 17867,
+                      17868, 17869, 17870, 17871, 17872, 17873, 17874, 17875, 17876,
+                      17877, 17878, 17879, 17880, 17881, 17882, 17883, 17884, 17885,
+                      17886, 17887, 17888, 17889, 17890, 17891, 17892, 17893, 17894,
+                      17895, 17896, 17897, 17898, 17899, 17900, 17901, 17902, 17903,
+                      17904, 17905, 17906, 17907, 17908, 17909, 17910, 17911, 17912,
+                      17913, 17914, 17915, 17916, 17917, 17918, 17919, 17920, 17921,
+                      17922, 17923, 17924, 17925, 17926, 17927, 17928, 17929, 17930,
+                      17931, 17932, 17933, 17934, 17935, 17936, 17937, 17938, 17939,
+                      17940, 17941, 17942), class = "Date")


beg <- "2018-12-27"
beg <- as.Date(beg, "%Y-%m-%d")
end <- "2018-12-28"
end <- as.Date(end, "%Y-%m-%d")
id <- as.character("1111_1111")
num <- 1

dates <- as.Date(dates,"%Y-%m-%d")

l2 <- data.frame("id"=NA, "event"=NA, "date"=as.Date(NA,"%Y-%m-%d"), "raster"=NA)

for (i in 1:length(dates)) {
    if (dates[i] >= beg & dates[i] <= end) {
      interm <- cbind(id,num,as.Date(dates[i],"%Y-%m-%d"),i)
      colnames(interm) <- c("id","event","date","raster")
      l2 <- rbind(l2,interm)
    } else {next}
  }


j'aimerais ainsi obtenir un tableau avec pour chaque indiv et chaque event, le nombre de fichiers correspondant au nombre de jours qu'a duré l'event, et la référence de chaque fichier (par sa date et la ligne i).

Problème : les dates ne s'affichent pas dans le bon format, que ce soit dans le tableau intermédiaire ou dans le tableau final. J'obtiens un nombre (julian days ?), mais pas le bon format, et je ne peux pas faire as.Date après.

J'espère avoir été claire dans ma formulation, merci de votre aide
L.
L.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Format as.Date avec cbind

Messagepar Pierre-Yves Berrard » 21 Mai 2019, 08:49

J'ai un peu de mal à comprendre, du coup j'ai essayé d'exécuter le code mais il n'est pas reproductible :

Code : Tout sélectionner

Error in cbind(id[a], num[a], as.Date(dates[i], "%Y-%m-%d"), i) :
  object 'a' not found
PY

Laëtitia VIBERT
Messages : 42
Enregistré le : 16 Avr 2019, 10:13

Re: Format as.Date avec cbind

Messagepar Laëtitia VIBERT » 21 Mai 2019, 08:49

désolée, l'erreur est corrigée =)
L.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Format as.Date avec cbind

Messagepar Pierre-Yves Berrard » 21 Mai 2019, 09:04

C'est la ligne avec rbind qui plante car les colonnes de interm et l2 ne sont pas au même format.

Pourquoi ? Car cbind appliqué sur des vecteurs crée une matrice où tout est censé être homogène. Donc date et nombres sont convertis en caractère :

Code : Tout sélectionner

cbind("1", 4, as.Date("2019-05-21"))

#>     [,1] [,2] [,3]   
#> [1,] "1"  "4"  "18037"

Solution : ne pas utiliser cbind pour créer un data.frame mais data.frame (intuitif non ?).

Code : Tout sélectionner

for (i in 1:length(dates)) {
  if (dates[i] >= beg & dates[i] <= end) {
    interm <- data.frame(id = id, event = num, date = dates[i], raster = i)
    l2 <- rbind(l2, interm)
  }
}
P.S. : else {next} est superflu
PY

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: Format as.Date avec cbind

Messagepar Serge Rapenne » 21 Mai 2019, 09:05

Bonjour,

le pb est là :

Code : Tout sélectionner

interm <- cbind(id,num,as.Date(dates[i],"%Y-%m-%d"),i)
tous les éléments doivent être du même type, ce sont donc des character.

remplacer

Code : Tout sélectionner

interm <- cbind(id,num,as.Date(dates[i],"%Y-%m-%d"),i)
      colnames(interm) <- c("id","event","date","raster")
par

Code : Tout sélectionner

interm <- data.frame(id=id,event=num,date=dates[i],raster=i)
devrait resoudre ton pb

Serge

Edit : Grillé

Laëtitia VIBERT
Messages : 42
Enregistré le : 16 Avr 2019, 10:13

Re: Format as.Date avec cbind

Messagepar Laëtitia VIBERT » 21 Mai 2019, 09:11

So simple!
Merci Pierre-Yves Berrard et Serge Rapenne pour votre aide =)
L.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Format as.Date avec cbind

Messagepar Pierre-Yves Berrard » 21 Mai 2019, 09:12

Serge Rapenne a écrit :Edit : Grillé

De peu.
Image
PY

Serge Rapenne
Messages : 1426
Enregistré le : 20 Aoû 2007, 15:17
Contact :

Re: [Résolu] Format as.Date avec cbind

Messagepar Serge Rapenne » 21 Mai 2019, 09:24

:-)


Retourner vers « Questions en cours »

Qui est en ligne

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