2017-08-15 1 views
0

私は、複数年にわたる毎時の観測気候データを持つデータフレームを持っています。データ値のn%がposix日付でグループ分けされた変数に存在するかどうかのテスト

dateTime <- seq(as.POSIXct("2012-01-01"), 
         as.POSIXct("2012-12-31"), 
         by=(60*60)) 
WS <- sample(0:20,8761,rep=TRUE) 
WD <- sample(0:390,8761,rep=TRUE) 
Temp <- sample(0:40,8761,rep=TRUE) 
df <- data.frame(dateTime,WS,WD,Temp) 
df$WS[WS>15] <- NA 

私はDF $ WSは、その月の有効なデータの75%以上を持っている場合見つけるために(月ごと、またはこの例では)年によってグループにする必要があります。私のフィルタリング基準は、0はまだ有効な観測値であるため、NAです。観測気候データなので、私は本当のNAを持っています。これらの私は新しい列「月」でファイラーする%>%の機能を使用して配管するだけでなく、ここに Calculate the percentages of a column in a data frame - "grouped" by column上のいくつかの質問を検討dplyr試してみました

Making a data frame of count of NA by variable for multiple data frames in a listR group by date, and summarize the values

どれも私を本当に答えませんでした質問。

私の望みは、この基準がその年/駅で満たされていれば、すべての駅と各駅のすべての年を通って風のバラを生み出すループ関数で動作する長いスクリプトに何かを入れることです。もっと明確にする必要がある場合は、私にお知らせください。 乾杯

+0

変数 'Temp'に対して有効なデータはありますか? –

+0

変数は$ WS – Dee

答えて

1

これはさまざまな方法があります。これは非常に有益なようです。

まず、月を示す新しい変数を作成します(1年以上の場合は、その年のアカウント)。この変数を分割し、NAsの数を数えます。これを値の数で割って100を掛けてパーセンテージポイントを得る。

df$monthyear <- format(df$dateTime, format = "%m %Y") 

out <- split(df, f = df$monthyear) 

sapply(out, function(x) (sum(is.na(x$WS))/nrow(x)) * 100) 

01 2012 02 2012 03 2012 04 2012 05 2012 06 2012 07 2012 
23.92473 21.40805 24.09152 25.00000 20.56452 24.58333 27.15054 
08 2012 09 2012 10 2012 11 2012 12 2012 
22.31183 25.69444 23.22148 21.80556 24.96533 

また、data.tableを使用することもできます。

library(data.table) 
setDT(df) 

df[, (sum(is.na(WS))/.N) * 100, by = monthyear] 

    monthyear  V1 
1: 01 2012 23.92473 
2: 02 2012 21.40805 
3: 03 2012 24.09152 
4: 04 2012 25.00000 
5: 05 2012 20.56452 
6: 06 2012 24.58333 
7: 07 2012 27.15054 
8: 08 2012 22.31183 
9: 09 2012 25.69444 
10: 10 2012 23.22148 
11: 11 2012 21.80556 
12: 12 2012 24.96533 
+0

です。どちらの関数も私のために働いています。ありがとう。 data.tableを使用して、ループ内にIF関数を与えてグラフを作成できるようになりました。私はあなたの助けに感謝します。 – Dee

0

ここにはdplyrを使用する方法があります。欠落しているデータがあっても動作します。

library(lubridate) #for the days_in_month function 
library(dplyr) 

df2 <- df %>% mutate(Month=format(dateTime,"%Y-%m")) %>% 
    group_by(Month) %>% 
    summarise(No.Obs=sum(!is.na(WS)), 
      Max.Obs=24*days_in_month(as.Date(paste0(first(Month),"-01")))) %>% 
    mutate(Obs.Rate=No.Obs/Max.Obs) 

df2 
    Month No.Obs Max.Obs Obs.Rate 
    <chr> <int> <dbl>  <dbl> 
1 2012-01 575  744 0.7728495 
2 2012-02 545  696 0.7830460 
3 2012-03 560  744 0.7526882 
4 2012-04 537  720 0.7458333 
5 2012-05 567  744 0.7620968 
6 2012-06 557  720 0.7736111 
7 2012-07 553  744 0.7432796 
8 2012-08 568  744 0.7634409 
9 2012-09 546  720 0.7583333 
10 2012-10 544  744 0.7311828 
11 2012-11 546  720 0.7583333 
12 2012-12 554  744 0.7446237 
+0

Max.Obsは、すべての日が完了していない(特に、ステーションが録画を開始したときにデータの先頭にある)わけではなく、days_in_month(as.Date(paste0最初(月)、 "01")))ステーション間でも可変である。あなたの提案にそれを回避する方法はありますか? – Dee

関連する問題