2017-08-15 22 views
0

我有一個數據框,其中包含多年來每小時觀測的氣候數據,我在下面包含了一個虛擬數據框,這將有望說明我的QU。測試數據值是否存在於按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%以上的當月有效數據。我的過濾標準是NA,因爲0仍然是有效的觀察結果。因爲它是觀測氣候數據,所以我有真正的NA。

我已經試過dplyr R group by date, and summarize the values

這些都沒有真正回答使用%>%功能由新列「月」,以文件管理器 Making a data frame of count of NA by variable for multiple data frames in a list,管道以及在這裏 Calculate the percentages of a column in a data frame - "grouped" by column審查的幾個問題,我題。

我的希望是把一些東西放在一個循環函數中,這個循環函數將會經過我所有的工作站和每個工作站的所有年份,以產生一個風玫瑰,如果這個標準符合那個年份/工作站的話。如果我需要澄清更多,請讓我知道。 乾杯

+0

對於哪個變量'Temp'有效的數據? –

+0

變量是$ WS – Dee

回答

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(first(Month),「 - 01」)))在站之間也是可變的。在你的建議中有沒有解決方法? – Dee