J'ai un bloc de données (precipitation) avec des colonnes associant différentes variables de regroupement à chaque échantillon (point dans une série temporelle) :

    Date                Precipitation  Year     Month       Season
    <S3: POSIXct>       <dbl>          <dbl>    <ord>       <fctr>
1   1970-12-31 18:00:00 0.1900503      1970     December    Autumn
2   1971-01-01 18:00:00 0.4749126      1971     January     Winter
3   1971-01-02 18:00:00 6.1823234      1971     January     Winter
4   1971-01-03 18:00:00 2.7953697      1971     January     Winter
5   1971-01-04 18:00:00 2.6522014      1971     January     Winter
6   1971-01-05 18:00:00 8.7417027      1971     January     Winter

Je voudrais filtrer cette trame de données par groupe en fonction de plusieurs seuils, calculés par groupe. Les seuils sont résumés dans une trame de données générée comme suit :

percentile <- groupwisePercentile(Precipitation ~ Season, data = precipitation, tau = 0.9)
percentile

Season  n      tau    Percentile
<fctr>  <int>  <dbl>  <dbl>
Autumn  4509   0.9    5.19  
Spring  4520   0.9    3.47  
Summer  4508   0.9    6.01  
Winter  4513   0.9    4.32  

Je ne sais pas comment faire référence aux valeurs de ce bloc de données pour filtrer le bloc de données precipitation par groupe, eg en utilisant group_by suivi de filter dans dplyr . Pour l'instant, j'utilise une méthode très inélégante qui est également assez laborieuse lorsqu'il s'agit de regroupements avec plus de niveaux : je concatène des sous-ensembles des tableaux qui ont été filtrés en entrant manuellement la valeur du bloc de données percentile, comme ceci :

filtered_winter <- precipitation %>%
  filter(Season == "Winter") %>%
  filter(Precipitation >= 4.32)

Que pour chaque groupe, alors je les lie :

events <- rbind(filtered_winter,filtered_spring,filtered_summer,filtered_autumn)

Comment puis-je générer le même tableau, c'est-à-dire filtré par groupe avec un seuil différent pour chaque groupe, en utilisant une méthode élégante ?

2
Lisa 15 nov. 2020 à 19:44

1 réponse

Meilleure réponse

Vous pouvez essayer d'utiliser le package fuzzy_join.

En prenant votre résultat et vos données groupwisePercentile, vous pouvez lier Season dans les deux blocs de données et joindre où Precipitation est >= à Percentile dans les données de seuil récapitulatives.

library(rcompanion)
library(fuzzyjoin)

summary_df <- groupwisePercentile(Precipitation ~ Season, data = precipitation, tau = 0.9)

fuzzy_inner_join(precipitation, 
                summary_df,
                by = c("Season" = "Season",
                       "Precipitation" = "Percentile"),
                match_fun = list(`==`, `>=`))
1
Ben 15 nov. 2020 à 18:22