Последнее наблюдение для каждой компании за каждый месяц (R) - PullRequest
3 голосов
/ 01 мая 2019

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

Я попытался использовать z[apply.monthly(z$date,max,by = z$seriesid)], однако это возвращает только NA. Другие попытки с применением только вернули мне одно значение даты (поэтому не объединяются с сериалами)

 date      company totalreturn   close seriesid 
 1: 2018-01-30 x   910.2214 133.375    55860     
 2: 2018-02-06 x   905.9561 132.750    55860     
 3: 2018-02-13 x   900.8377 132.000    55860     
 4: 2018-02-20 x   900.8377 132.000    55860     
 5: 2018-02-27 x   911.0745 133.500    55860     
 6: 2017-03-06 y   921.3112 135.000    55940    
 7: 2017-03-13 y   917.8990 134.500    55940    

В идеале набор данных должен отображаться как

 date      company totalreturn   close seriesid 
 1: 2018-01-30 x   910.2214 133.375    55860        
 5: 2018-02-27 x   911.0745 133.500    55860         
 7: 2017-03-13 y   917.8990 134.500    55940 

Содержит одно наблюдение на компанию в месяц, которое не является NA

1 Ответ

1 голос
/ 01 мая 2019

Мы могли бы group_by seriesid и год-месяц и выбрать последнюю строку, отличную от NA, для totalreturn и close.

library(dplyr)

df %>%
  group_by(seriesid, month = format(date, "%Y%m")) %>%
  slice(which.max(cumsum(!is.na(totalreturn) & !is.na(close)))) %>%
  ungroup() %>%
  select(-month)


#       date    company totalreturn close seriesid
#      <date>   <fct>         <dbl> <dbl>    <int>
#1    2018-01-30 x              910.  133.    55860
#2    2018-02-27 x              911.  134.    55860
#3    2017-03-13 y              918.  134.    55940

Предполагается, что ваш столбец date имеет тип Date, иначе вам сначала нужно изменить его на класс Date.


Или используя базу R ave мы можем сделать

df1 <- df[complete.cases(df), ]

df1[unique(with(df1, ave(seq_along(date), seriesid, format(date, "%Y%m"), 
           FUN = function(x) tail(x, 1)))), ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...