2016-07-11 2 views
0

Dire que j'ai 10 data.frame s contenant des dates dans leurs noms de 01-01-00-10-01-00 avec d'autres lettres et des symboles ajoutés à la fin dans le format ddmmyyEst-ce que ls() peut avoir un motif> 1?

Par ex010100/sgh/d_3 et 020100/aff/d_1

Si je voulais créer un vecteur de data.frame ci-dessus, est-il possible de les sélectionner sans les écrire individuellement?

J'ai essayé de créer un vecteur d'une séquence de dates et de mettre cela dans pattern = mais est venu avec erreur (code ci-dessous):

Dates <- seq(as.Date("2000-01-01"),as.Date("2000-01-02"),1) 
Dates <- format(Dates,"%d%m%y") 
ls(pattern=Dates) 

In grep(pattern, all.names, value = TRUE) : 
    argument 'pattern' has length > 1 and only the first element will be used 

Je suppose que modèle ne peut être une valeur?

+0

@LyzandeR ce n'est pas le cas. il va correspondre les choses avec le mot "Dates" dans le nom. – Spacedman

+0

Jetez un oeil à 'stri_detect' du paquet' stringi'. J'adore ce paquet, il offre toutes les opérations basées sur regex avec une syntaxe cohérente! –

+0

En fait 'stri_subset' appliqué sur' ls() 'devrait faire ce que vous voulez! –

Répondre

1

Créez un motif correspondant à l'une des chaînes de date souhaitées. Une façon est de se joindre à toutes les chaînes avec | caractères:

> Dates <- seq(as.Date("2000-01-01"),as.Date("2000-01-10"),1) 
> Dates 
[1] "2000-01-01" "2000-01-02" "2000-01-03" "2000-01-04" "2000-01-05" 
[6] "2000-01-06" "2000-01-07" "2000-01-08" "2000-01-09" "2000-01-10" 
> D2 = paste(Dates,collapse="|") 
> D2 
[1] "2000-01-01|2000-01-02|2000-01-03|2000-01-04|2000-01-05|2000-01-06|2000-01-07|2000-01-08|2000-01-09|2000-01-10" 

Maintenant, j'ai un espace de travail avec divers morceaux dans:

> ls() 
[1] "d"    "d010100foo"  "d010110bar"  "D2"    
[5] "d2000-01-01bar" "d2000-01-10bar" "d2000-02-10foo" "Dates"   
[9] "dorig"   "j"    "p"    "x"    
[13] "y"    "z"    

Mais si j'utilise ce modèle que j'obtenir ceux qui correspondent aux dates:

> ls(pattern=D2) 
[1] "d2000-01-01bar" "d2000-01-10bar" 

Cela pourrait obtenir trop compliqué si vous avez eu beaucoup de choses à correspondre, mais que ce point vous pouvez probablement écrire un regexp plus simple pour correspondre à tous les minces gs - quelque chose comme [0-9]{4}-[0-9]{2}-[0-9]{2} (non testé) qui devrait correspondre à quatre chiffres, tiret, deux chiffres, tiret, séquence à deux chiffres.

Ajustez le motif pour qu'il corresponde au format de votre date. Le format que vous avez utilisé n'est pas recommandé: https://xkcd.com/1179/

+0

Cela a fonctionné parfaitement, merci beaucoup! – Bonono