2017-09-12 5 views
0

J'ai un fichier csv avec tous les jours fériés d'un an, ce qui est "FICHIER A". J'ai aussi un assez gros fichier csv avec des données, qui contient une colonne contenant des dates dans la classe POSIXlt. Le dernier est "FICHIER B"Trouver quel jour est un jour férié dans une grande base de données - ÉNORME exécution

La question est, comment puis-je voir quelles dates dans le FICHIER B sont des vacances? Permettez-moi de arrangerai l'environnement, afin que vous puissiez le comprendre:

Supposons que l'objet vacances contient toutes les vacances de l'année et supposons que df est le dataframe contenant un tas de choses. Mais, les colonnes Dates de df contient la date de cet événement d'événement

La façon dont je résous le problème a été en utilisant les fonctions suivantes et le code

b <- df$dates 
z <- lapply(b, isHoliday) 

isHoliday est mis en œuvre comme:

isHoliday<- function(var){ 
return (any(holidays == as.Date(var)) ) #remember: var is on POSIXlt 
} 

Cela fonctionne, si df $ dates a peu d'éléments. Mais, ma DF a près de 3 millions de lignes. Et, après 15 minutes, il n'y avait pas de retour.

Pour cette raison, je demande à nouveau

Comment puis-je voir quelles dates sont des jours fériés?

+0

Quelle est la sortie que vous recherchez, êtes-vous après un vecteur logique de la même longueur que 'b'? –

+0

Oui, désolé de l'avoir manqué. La sortie que je désire est un vecteur logique, de la même longueur que b, donc je pourrais lier le vecteur comme une autre colonne – Homunculus

+1

Vous devriez fournir un exemple reproductible. Voici quelques conseils pour de meilleures performances: remplacez POSIXlt par POSIXct, utilisez data.table et fusionnez les deux ensembles de données. – agstudy

Répondre

3

Ne pas utiliser lapply - vous voulez essentiellement:

as.Date(b) %in% holidays 

Alors que lapply fera une boucle sur chaque valeur unique de b et exécuter as.Date et anylength(b) fois, ce code fonctionnera as.Date une fois, puis faire tout les comparaisons en code vectorisé compilé en utilisant %in%.

L'utilisation de == est également incorrecte car le côté gauche est recyclé. E.g .:

1:2 == c(1:2,2:1) 
#[1] TRUE TRUE FALSE FALSE