2017-08-31 5 views
1

Mes données est structuré comme suit:R: Sélection de sous-ensemble datetime avec condition "AAAA-MM"

 curr  time 
     <chr> <date> 
1  USD 2015-07-18 
2  USD 2014-10-16 
3  USD 2016-03-26 

Question:

J'aime sélectionner le mois complet

subset(ks, deadline >= '2010-01' & deadline <= '2016-03') 

Cette retourne

Error in charToDate(x) : 
    character string is not in a standard unambiguous format. 

Thi s fonctionne, mais aurait toujours besoin d'une vérification manuelle des jours d'un mois.

subset(ks, deadline >= '2010-01-01' & deadline <= '2016-03-31') 

Existe-t-il un moyen de faire fonctionner la première version "d'erreur"?

+0

Vous pourriez ajouter une ew colonne 'ks $ time2 <- strftime (ks $ heure,"% Y-% m ")', puis appliquez votre filtre à cette colonne. 'sous-ensemble (ks, time2> =" 2010-01 "& time2 <=" 2016-03 "' – count

+0

@count Je n'avais qu'une seule question ici: strftime renvoie un 'character'. 'Strings'? Je voulais juste apprendre –

+0

@Fanny Salut, si une réponse résout votre problème pouvez-vous cliquer sur" accepter "pour que les autres puissent le voir? merci – agenis

Répondre

1

J'ai seulement une longue approche ici! La condition de vérification doit comporter 3 parties:

  1. Toutes les années avec tous les mois dans l'intervalle: par ex. dans notre cas, les années 2010 à 2015 tous les mois sont considérés.

  2. La dernière année: Peut être seulement quelques mois sont impliqués ici. Depuis 2016, seuls les 3 premiers mois sont considérés. Idem pour l'année à partir

    library(lubridate) 
    log.cond <- (year(dt$time) %in% 2010:2015) | (year(dt$time) == 2016 & month(dt$time) %in% 1:3) 
    subset(dt, log.cond) 
    
0

Il semble que toutes les dates et les délais sont en format de caractères. Le mieux est d'utiliser les formats de date (comme la très utile famille de fonctions ymd, ymd_hms, , month etc. du paquet lubridate) Mais s'ils sont dans l'ordre anglais (année d'abord, puis mois, puis jour, avec des zéros), vous n'avez pas réellement besoin de les transformer en dates au sous-ensemble, vous pouvez tout laisser en format texte, couper les 3 derniers caractères (jours) et R se faire des comparaisons numériques:

ks = data.frame(curr="USD", "time"=c("2015-07-18", "2014-10-16", "2016-03-26"), stringsAsFactors = F) 
ks$time2 <- substr(ks$time, 1, nchar(ks$time)-3) 

Ensuite, vous pouvez utiliser votre première syntaxe sans aucun changement:

subset(ks, time2 >= '2015-01' & time2 <= '2016-03') 
#### curr  time time2 
#### 1 USD 2015-07-18 2015-07 
#### 3 USD 2016-03-26 2016-03 
+1

Juste une correction mineure Le format' AAAA-MM-DD' est l'un des formats de date ISO 8601, ISO 8601 a été adopté par de nombreux pays à travers le monde, mais les formats de date locaux sont encore largement utilisés, par exemple, aux États-Unis qui est l'une des principales régions anglophones, le format MM/DD/YYYY est préféré – Uwe

+0

le 'substr' suggéré ici peut également être remplacé par' strptime' suggéré dans un commentaire – agenis