Использование суммирования (или эквивалентного?) Для создания столбца функций в R-кадре данных - PullRequest
1 голос
/ 17 мая 2019

Я работаю с некоторыми данными об электроэнергии, которые для каждого часа, дня и актива имеют пошаговую функцию, которая определяет предложение актива по растущим ценам.То, что я хотел бы сделать, это объединить эти данные во фрейм данных, таблицу и т. Д. С датой, временем, активом и функцией шага для конкретной строки.Затем я буду использовать эту функцию шага, чтобы заполнить некоторые другие столбцы позже.

Вот быстрый воспроизводимый пример того, что я хочу сделать.

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)))

1 Ответ

2 голосов
/ 17 мая 2019

Лучше обернуть его в list, так как eg_func является функцией, а затем извлечь элементы list с помощью map, применить функцию к переданному аргументу, чтобы создать новый столбец 'bid_50'

library(tidyverse)
df_test %>%
  group_by(asset) %>% 
  summarize(step_func=list(generate_func(from[-1],price))) %>%
  mutate(bid_50 = map_dbl(step_func, ~ .x(50)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...