Dplyr: как получить последнее наблюдение за вектором в (очень) сжатой форме?

#r #dplyr

#r #dplyr

Вопрос:

Рассмотрим следующий пример

 return <- c(0.02,0.0,0.01,-0.04)
date <- c(1,2,3,4)
df_day <- data.frame(date,return)

> df_day
  date return
1    1   0.02
2    2   0.00
3    3   0.01
4    4  -0.04
  

Я хочу объединить возвращаемые данные и получить объединенные возвраты в момент времени 4.
Длительное рабочее решение заключается в следующем

 df_agg1 <- df_day %>%
  arrange(date) %>%
  mutate(cumret = cumprod(1   return) - 1,
         compound = last(cumret)) %>%
  filter(row_number() == 1)

> df_agg1
  date return cumret  compound
1    1   0.02   0.02 -0.011008
  

Я не понимаю, почему приведенный выше код нельзя сократить следующим образом:

 df_agg2 <- df_day %>%
  arrange(date) %>%
  summarise(compound= last(cumprod(1   return) - 1))
  

Здесь мой код должен возвращать одно единственное значение. Действительно, я получаю последнее значение (следовательно, в момент времени 4) вектора совокупных произведений (минус один).

К сожалению, я получаю

Ошибка в eval(substitute (expr), envir, enclos): неподдерживаемый язык векторных типов

В чем здесь проблема? Спасибо!

Комментарии:

1. Попробуйте с nth() вместо: df_day %>% arrange(date) %>% mutate(compound = nth(cumprod(1 return) - 1, -1L)) %>% filter(row_number() == 1)

2. Взгляните на проблемы здесь и здесь

3. Я думаю, вы запутались в агрегировании. Вы используете nth() в mutate() .. почему вы ожидаете, что он будет что-то агрегировать?

4. Вот альтернатива: ... %>% mutate(compound = cumprod(1 return) - 1) %>% slice(n())

5. df_day %>% arrange(date) %>% summarise(compound = (cumprod(1 return) - 1)[n()]) тоже работает. Ваше решение (предположительно) не работает из-за ошибки в модном dplyr бэкэнде.