Мы могли бы 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)))), ]