我正在处理一些电力数据,该数据具有每小时,一天和一天的资产,该函数具有逐步功能,该功能指定了资产价格不断上涨的电力供应。我想做的是使用日期,时间,资产和特定于行的步进函数将这些数据折叠成数据框,小标题等。然后,稍后我将使用该步进函数填充其他一些列。
这是我想要做的一个可快速复制的示例。
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个区块,但这很可能对这里的问题并不重要)。
现在,我要做的是,对于每种资产,使用 从,到和定价块,然后按资产将其存储在数据框中(同样,在我的扩展情况下,将按日期,小时和资产)。
例如,使用第一组我可以做到
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函数使我可以找到资产1的任意值x的隐含价格。
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))
但这将第二步功能应用于每个人。如何用评估为50的每个资产的阶跃函数填充bid_50列?
使用解决方案再次更新#2 @akrun:
df_func <-df_func %>% mutate(bid_50=map_dbl(step_func, ~ .x(50)))
答案 0 :(得分:2)
最好将其包装在list
中,因为eg_func
是一个函数,然后使用list
提取map
元素,将该函数应用于传递给create的参数上新列“ 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)))