我有一个数据框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的观察
答案 0 :(得分:0)
使用dplyr
和lubridate
的一种解决方案可能是:
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
和年份-月份,并选择totalreturn
和close
的最后一行非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)))), ]