2015-02-10 1 views
0

У меня есть этот dataframe, который охватывает данные 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)
  • Читать п дней данных до этой конкретной даты с каждым годом этого набора данных.

Ожидаемый результат (скажем, п = 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 дней данных - каждый год - ПОСЛЕ этой конкретной даты. Итак, вы хотите ПОСЛЕ или ПЕРЕД? –

+0

Извините, я хочу все. Это важная дата (0103), а не год. Поэтому, если я упомянул 19650103, я хочу за 3 года до этого. Спасибо – maximusdooku

+0

Однако, будет неплохо иметь опцию, где я могу использовать данные только до определенного года. Итак, если я упомянул дату в 1970 году, я использую только годы до этого. Но я могу понять это позже, я думаю. – maximusdooku

ответ

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 

Edit:

Так как вы хотели бы, чтобы выбрать года до (включительно) года ввод даты, вы могли бы использовать что-то вроде этого:

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))) 
Смежные вопросы