web-dev-qa-db-fra.com

Comparer deux dates en R

J'ai un fichier texte séparé par des tabulations que j'ai importé dans R. J'ai utilisé la commande suivante pour l'importation:

data = read.table(soubor, header = TRUE, sep = "\t", dec = ".", colClasses =c("numeric","numeric","character","Date","numeric","numeric"))

Lorsque j'exécute str(data) pour vérifier les types de données de mes colonnes, j'obtiens:

'data.frame':   211931 obs. of  6 variables:
$ DataValue   : num  0 0 0 0 0 0 0 0 0 NA ...
$ SiteID      : num  1 1 1 1 1 1 1 1 1 1 ...
$ VariableCode: chr  "Sucho" "Sucho" "Sucho" "Sucho" ...
$ DateTimeUTC : Date, format: "2012-07-01" "2012-07-02" "2012-07-03" "2012-07-04" ...
$ Latitude    : num  50.8 50.8 50.8 50.8 50.8 ...
$ Longitude   : num  15.6 15.6 15.6 15.6 15.6 ...

Un échantillon reproductible des 20 premières lignes de mes données est ici:

mon_échantillon = dput (données [1:20,])

structure(list(DataValue = c(0, 0, 0, 0, 0, 0, 0, 0, 0, NA, NA, 
NA, NA, NA, NA, NA, NA, 0, 0, 0), SiteID = c(1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), VariableCode = c("Sucho", 
"Sucho", "Sucho", "Sucho", "Sucho", "Sucho", "Sucho", "Sucho", 
"Sucho", "Sucho", "Sucho", "Sucho", "Sucho", "Sucho", "Sucho", 
"Sucho", "Sucho", "Sucho", "Sucho", "Sucho"), DateTimeUTC = structure(c(15522, 
15523, 15524, 15525, 15526, 15527, 15528, 15529, 15530, 15531, 
15532, 15533, 15534, 15535, 15536, 15537, 15538, 15539, 15540, 
15541), class = "Date"), Latitude = c(50.77, 50.77, 50.77, 50.77, 
50.77, 50.77, 50.77, 50.77, 50.77, 50.77, 50.77, 50.77, 50.77, 
50.77, 50.77, 50.77, 50.77, 50.77, 50.77, 50.77), Longitude = c(15.55, 
15.55, 15.55, 15.55, 15.55, 15.55, 15.55, 15.55, 15.55, 15.55, 
15.55, 15.55, 15.55, 15.55, 15.55, 15.55, 15.55, 15.55, 15.55, 
15.55)), .Names = c("DataValue", "SiteID", "VariableCode", "DateTimeUTC", 
"Latitude", "Longitude"), row.names = c(NA, 20L), class = "data.frame")

Maintenant, je veux filtrer ma table par date. Notez que j'exécute mon code dans une boucle for. Tout d'abord, je sous-ensemble mes données avant le 1er juillet 2012 et j'effectue un traitement. Ensuite, je sous-ensemble mes données avant le 2 juillet et je fais un peu de traitement, etc.

startDate = as.Date("2012-07-01");
endDate = as.Date("2012-07-20");
all_dates = seq(startDate, endDate, 1);

#the following code I'm trying to run inside a loop...
for (j in 1:length(all_dates)) {
    filterdate = all_dates[j];
    my_subset = my_sample[my_sample$DateTimeUTC == filterdate,]
    #now I want do do some processing on my_subset...
}

Mais le code ci-dessus renvoie un ensemble de données vide à partir de l'étape 7 de la boucle.

Ainsi, par exemple:

subset_one = my_sample[my_sample$DateTimeUTC == all_dates[6],]

renvoie: 3 obs of 6 variables.

Mais, pour une raison inconnue, l'exemple:

subset_two = my_sample[my_sample$DateTimeUTC == all_dates[7],]

renvoie: 0 obs of 6 variables.

(note: j'ai édité le code ci-dessus pour rendre mon problème 100% reproductible)

Des idées sur ce que je fais mal?

12
jirikadlec2

La solution suivante a résolu mon problème: Au lieu d'utiliser le type de données Date, j'ai essayé d'utiliser le type de données POSIXct. Voici l'exemple de code pour lire le fichier texte séparé par des tabulations, après quoi le sous-ensemble a fonctionné à toutes les étapes de ma boucle for:

data = read.table("data.txt", header = TRUE, sep = "\t", dec = ".", 
    colClasses =c("numeric","numeric","character","POSIXct","numeric","numeric"));
startDate = as.POSIXct("2012-07-01");
endDate = as.POSIXct("2012-07-20");
all_dates = seq(startDate, endDate, 86400); #86400 is num of seconds in a day

#the following code I'm trying to run inside a loop...
for (j in 1:length(all_dates)) {
    filterdate = all_dates[j];
    my_subset = data[data$DateTimeUTC == filterdate,]
    #now I want do do some processing on my_subset...
}
6
jirikadlec2