Я работаю с некоторыми данными об электроэнергии, которые для каждого часа, дня и актива имеют пошаговую функцию, которая определяет предложение актива по растущим ценам.То, что я хотел бы сделать, это объединить эти данные во фрейм данных, таблицу и т. Д. С датой, временем, активом и функцией шага для конкретной строки.Затем я буду использовать эту функцию шага, чтобы заполнить некоторые другие столбцы позже.
Вот быстрый воспроизводимый пример того, что я хочу сделать.
library(dplyr)
df_test<-data.frame(rep(1:25, times=1, each=4))
names(df_test)[1]<-"asset"
df_test$block<-rep(1:4, times=25)
df_test$from<-rep(seq(0,150,50), times=25)
df_test$to<-df_test$from+50
df_test$index<-runif(100)*100
df_test<-df_test %>% group_by(asset) %>% mutate(price=cumsum(index))
Это, в основном, пример того, что я буду иметь для каждого часа каждого дня, за исключением того, что в моем случае,количество блоков разное (некоторые фирмы предлагают один блок, другие - до 7, но это, вероятно, не является существенной проблемой).
Теперь я хотел бы сделать для каждогоактивировать, вычислять пошаговую функцию, используя блоки from, to и price, и сохранять ее во фрейме данных по активам (опять же, в моем расширенном случае это будет дата, час и актив).
Например, используя первую группу, я мог бы сделать это
generate_func<-function(x,y){
stepfun(x, y, f = as.numeric(0), ties = "ordered",right = FALSE)
}
eg_func<-generate_func(df_test$from[2:4],df_test$price[1:4])
Функция eg_func позволяет мне найти подразумеваемую цену при любом значении x для актива 1.
eg_func(500)
[1] 43.10305
Что бы ямне нравится группировать мои данные по активам, а затем сохранять версию eg_func для каждого актива во втором столбце фрейма данных или эквивалентного ему.
По сути, я хочу сделать что-то вроде:
df_sum<-df_test %>% group_by(asset) %>% summarize(
step_func=generate_func(from[-1],price)
)
Но я получаю:
Error: Column `step_func` is of unsupported type function
Обновление:
@ akrun помог мне сделать шаг вперед.Итак, если я оберну функцию в список, я могу сделать то, что хочу ... по крайней мере, первый шаг:
df_func<-df_test %>%
group_by(asset) %>%
summarize(step_func=list(generate_func(from[-1],price)))
Итак, теперь у меня есть фрейм данных с функцией шага для каждогоактив.Теперь мой следующий квест - оценить эту функцию, чтобы создать новый столбец, оценивающий функцию шага с определенным значением.Так, например, я могу оценить ставку первого актива по значению 50:
df_func[1,2][[1]][[1]](50)
[1] 49.60776
Я бы хотел сделать это с помощью команды mutate, поэтому что-то похожее на:
df_func <-df_func %>% mutate(bid_50=step_func[[2]](50))
Но это относится ко всем функциям второго шага.Как заполнить столбец bid_50 шаговой функцией каждого актива, оцененной в 50?
Обновите # 2 @akrun еще раз с решением:
df_func <-df_func %>% mutate(bid_50=map_dbl(step_func, ~ .x(50)))