2015-02-10 35 views
0

我有這個數據框涵蓋了1960-1980年的數據。如何在每年的每個時間步之前閱讀n天?

dput->structure(list(DATE = 19620101:19620106, PRECIP = c(10.54, 6.39, 
0.01, 0, 0.02, 20.94), OBS_Q = c(2.39, 2.38, 2.22, 2.24, 2.26, 
5.13)), .Names = c("DATE", "PRECIP", "OBS_Q"), row.names = c(NA, 
6L), class = "data.frame") 

所有我想要做的是:

  • 提到某一特定日期(無論是作爲19620110或10)
  • 讀取n個數據的日子每年從該數據集的該特定日期之前。

預期輸出(比如N = 2,日期= 19620103)

19620101 10.54 2.39 
19620102 6.39 2.38 
19630101 11.54 3.39 
19630102 62.39 3.38 
19640101 12.54 4.39 
19640102 6.39 5.38 
* 
* 
19800101 12.12 3.44 
19800102 12.33 3.45 

我不知道如何在此進行。任何建議都是值得歡迎的。

+0

在輸出你提到,你讀了n天的數據 - 每年 - 在這個特定的日期之後。所以你想要後或之前? – 2015-02-10 16:48:35

+0

對不起,我想要所有。這是關鍵日期(0103),而不是一年。所以如果我提到19650103,我還需要3年。謝謝 – maximusdooku 2015-02-10 16:52:35

+0

但是,如果有一個選項,我只能在特定年份之前使用這些數據,這將是一件好事。所以,如果我在1970年提到一個日期,我只用了它之前的幾年。但我猜想我可以在以後找到它。 – maximusdooku 2015-02-10 17:59:20

回答

1

所以這裏是一個非優雅的方式來做到這一點。這個想法是隻檢查幾個月和幾天(並忽略輸入的年份)。如果有必要,在這些年中納入任何條件都會非常容易。因此,首先:

library(dplyr) # data manipulation 
library(lubridate) # time and dates manipulation 

df <- data.frame(DATE = c(19620101:19620106,19630101:19630106), 
       PRECIP = c(10.54, 6.39, 0.01, 0, 0.02, 20.94,10.54, 6.39, 0.01, 0, 0.02, 20.94), 
       OBS_Q = c(2.39, 2.38, 2.22, 2.24, 2.26, 5.13,2.39, 2.38, 2.22, 2.24, 2.26, 5.13)) 

# Here you actually specify what days to select. Only the "0106" part matters here 
day_in_a_year <- paste0("1962", "0106") 
days_shown <- 2 # how many days per year to show 
# so, in this case, select 6th January and the day before 

df %>% mutate(DATE = ymd(DATE)) %>% 
    arrange(DATE) %>% 
    filter(between(day(DATE), day(ymd(day_in_a_year) - days(days_shown - 1)), day(ymd(day_in_a_year))), 
     between(month(DATE), month(ymd(day_in_a_year) - days(days_shown - 1)), month(ymd(day_in_a_year)))) 

#   DATE PRECIP OBS_Q 
# 1 1962-01-05 0.02 2.26 
# 2 1962-01-06 20.94 5.13 
# 3 1963-01-05 0.02 2.26 
# 4 1963-01-06 20.94 5.13 

編輯:

既然你想(含)輸入日期的年份之前選擇裏,你可以使用這樣的事情:

df %>% mutate(DATE = ymd(DATE)) %>% 
    arrange(DATE) %>% 
    filter(between(day(DATE), day(ymd(day_in_a_year) - days(days_shown - 1)), day(ymd(day_in_a_year))), 
      between(month(DATE), month(ymd(day_in_a_year) - days(days_shown - 1)), month(ymd(day_in_a_year))), 
      year(DATE) <= year(ymd(day_in_a_year))) 
相關問題