每个公司每月的最后观察(R)

时间:2019-05-01 07:43:43

标签: r dataframe panel xts

我有一个数据框z,每天有800万个观测值。对于每个公司(使用seriesid进行度量),我都希望获得月中的最后一个值(如果有),以及总回报率和收盘价的(月内)之前的值。

我尝试使用 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 ,但是这仅返回NA。其他尝试套用的操作仅返回了我一个日期值(因此未与序列号结合使用)

 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 

理想情况下,数据集将显示为

text-align: center

每个公司每个月包含一项不属于NA的观察

2 个答案:

答案 0 :(得分:0)

使用dplyrlubridate的一种解决方案可能是:

df %>%
 mutate(date = ymd(date)) %>%
 na.omit() %>%
 group_by(seriesid, year_month = paste(year(date), month(date), sep = "_")) %>%
 filter(date == max(date)) %>%
 ungroup() %>%
 select(-year_month)

  date       company totalreturn close seriesid
  <date>     <chr>         <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

或者只是dplyr一样:

df %>%
 mutate(date = as.Date(date, format = "%Y-%m-%d")) %>%
 na.omit() %>%
 group_by(seriesid, year_month = format(date, "%Y-%m")) %>%
 filter(date == max(date)) %>%
 ungroup() %>%
 select(-year_month)

在这里,首先删除NA行。其次,它按“ seriesid”和年份和月份的组合进行分组。最后,它保留每年和每月的最大日期和“系列”的行。

答案 1 :(得分:0)

我们可以group_by seriesid和年份-月份,并选择totalreturnclose的最后一行非NA。

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)))), ]