#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
бэкэнде.