2017-03-26 1 views
0

Dans mes études J'analyse les vitesses historiques du vent des stations météorologiques (si la tendance est à la hausse ou à la baisse, etc.). Maintenant, j'ai une valeur pour chaque jour. Je veux compter les jours qui sont liés les uns aux autres (par exemple 1958-03-18, 19, 20 ...). pour chaque année je veux avoir une valeur combien de jours (tempête) ont eu lieu avec plus de 3 jours d'affilée.R Comptage des dates liées dans un objet XTS (ou data.frame)

exemple:

1982-01-30 41.04 
1982-02-02 45.72 
1982-02-03 46.8 
1982-02-04 41.04 
1982-02-12 39.24 
1982-02-17 53.28 
1982-02-18 49.68 
1982-02-19 40.32 
1982-03-01 46.08 

En Février 1982 2 fois est la situation (2,3,4) et (17,18,19).

Est-ce que quelqu'un sait comment compter cela et le mettre dans une nouvelle table pour plus d'analyse/traçage? Au moins, simplement compter tous les jours par an m'aiderait aussi.

Cordialement Sascha

+0

Quel est le seuil que vous avez utilisé pour une journée pour être qualifié de jour de tempête? –

+0

Supposons que vous ajoutez une colonne avec des données sous la forme 1,1,1,2,2,2,3,3,3 .. pour grouper des dates adjacentes. Puis fondez votre table pour réduire les lignes sur la valeur minimale dans chaque groupe, enfin compter les lignes dans la table fusionnée où cette valeur minimale dépasse le seuil. Vous aurez besoin de répéter ces étapes avec des colonnes comme 1,1,2,2,2,3,3,3,4,4 .. et 1,2,2,2,3,3,3,4,4, 4 .. –

+0

Notre base de données est des valeurs horaires par jour. la valeur maximale des 24 valeurs par jour est utilisée. Après cela, nous choisissons tous les jours où cette valeur est supérieure à 39 km/h. – Sascha

Répondre

1

Voici un moyen simple d'identifier les jours de tempête (vent> 39 selon votre commentaire) et les dates avec trois jours de tempête successifs.

#create example data 
fakedates <- as.Date("1982-01-01")+(1:730) 
fakewind <- sample(1:80, length(fakedates), replace = TRUE) 
dateyear <- format(fakedates, "%Y") 

df <- data.frame("dates"=fakedates, "maxwind"=fakewind, "year"=dateyear) 

#identify 'storm' days where max wind is >39 
df$storm <- df$maxwind > 39 #identify storm days 

# ensure original data is in chronological order, otherwise you would need to sort first 
# e.g. if(is.unsorted(original$dates), sort(original$dates, .... etc) 

#identify 3-day storms - undetermined for last two days in the record 
df$storm3 <- 
    c(df$storm[1:(length(df$storm) - 2)] & 
     df$storm[2:(length(df$storm) - 1)] & 
     df$storm[3:(length(df$storm))], "unknown", "unknown") 

#select all storm day records 
dfs <- df[df$storm == TRUE, c(1:3)] 

#select only dates of 3-day storms 
dfs3 <- df[df$storm3== TRUE,(1:3)] 

Votre sortie ressemblerait à quelque chose comme ceci:

> head(dfs3) 
     dates maxwind year 
12 1982-01-13  57 1982 
13 1982-01-14  47 1982 
33 1982-02-03  65 1982 
49 1982-02-19  79 1982 
61 1982-03-03  49 1982 
68 1982-03-10  55 1982 

Vous pouvez résumer par année et faire tout autres analyses dont vous avez besoin, que ce soit avec tous les jours de tempête (les SFD) ou les jours de tempête de trois jours seulement (dfs3).

Lorsque vous êtes plus familier avec R, vous pouvez vous attaquer à la tâche de diverses autres manières, par ex. avec le paquet dplyr

+0

Salut Jules, je ne suis pas très familier avec R mais j'essaie d'utiliser votre suggestion. Merci beaucoup, il semble que je peux l'utiliser :) Avec dplyr je veux vérifier par exemple quels jours se produisent dans toutes les stations. – Sascha