Как выбрать самую раннюю дату в месяце из ряда дат в R? - PullRequest
0 голосов
/ 14 октября 2019

У меня есть база данных, содержащая значения разных индексов с разной периодичностью (еженедельно, ежемесячно, ежедневно) данных. Я надеюсь рассчитать ежемесячную доходность путем абстрагирования значения начала месяца от временного ряда.

Я попытался использовать цикл для разделения временных рядов месяц за месяцем, а затем с помощью min () получить самую раннюю дату в месяце. Однако мне интересно, есть ли более эффективный способ ускорить расчеты.

library(data.table)
df<-fread("statistic_date index_value funds_number
           2013-1-1    1000.000            0
           2013-1-4     996.096           21
           2013-1-11    1011.141           21
           2013-1-18    1057.344           21
           2013-1-25    1073.376           21
           2013-2-1    1150.479           22
           2013-2-8    1150.288           19
           2013-2-22    1112.993           18
           2013-3-1    1148.826           20
           2013-3-8    1093.515           18
           2013-3-15    1092.352           17
           2013-3-22    1138.346           18
           2013-3-29    1107.440           17
           2013-4-3    1101.897           17
           2013-4-12    1093.344           17")

Я ожидаю фильтрации для получения строк с самой ранней датой каждого месяца, например:

2013-1-1    1000.000            0
2013-2-1    1150.479           22
2013-3-1    1148.826           20
2013-4-3    1101.897           17

Ваша помощь будет высоко оценена!

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Первый изготовитель statistic_date a Дата:

df$statistic_date <- as.Date(df$statistic_date)

Вы можете использовать nth_day, чтобы найти первый день каждого месяца в statistic_date.

library("datetimeutils")
dates <- nth_day(df$statistic_date, period = "month", n = "first")
## [1] "2013-01-01" "2013-02-01" "2013-03-01" "2013-04-03"

df[statistic_date %in% dates]
##    statistic_date index_value funds_number
## 1:     2013-01-01    1000.000            0
## 2:     2013-02-01    1150.479           22
## 3:     2013-03-01    1148.826           20
## 4:     2013-04-03    1101.897           17
0 голосов
/ 14 октября 2019

Использование пакетов tidyverse и lubridate,

library(lubridate)
library(tidyverse)
df %>% mutate(statistic_date = ymd(statistic_date), # convert statistic_date to date format
              month = month(statistic_date),  #create month and year columns
              year= year(statistic_date)) %>%
       group_by(month,year) %>% # group by month and year
       arrange(statistic_date) %>% # make sure the df is sorted by date
       filter(row_number()==1) # select first row within each group



# A tibble: 4 x 5
# Groups:   month, year [4]
#  statistic_date index_value funds_number month  year
#  <date>               <dbl>        <int> <dbl> <dbl>
#1 2013-01-01           1000             0     1  2013
#2 2013-02-01           1150.           22     2  2013
#3 2013-03-01           1149.           20     3  2013
#4 2013-04-03           1102.           17     4  2013
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...