r - 使用汇总(或等效?)在 R 数据框中创建一列函数
问题描述
我正在处理一些电力数据,这些电力数据对于每一小时、每一天和资产都有一个阶梯函数,该函数指定资产以不断上涨的价格提供电力。我想做的是将这些数据折叠成一个数据框、小标题等,带有日期、时间、资产和特定于行的步进函数。稍后我将使用该步进函数来填充其他一些列。
这是我想做的一个快速可重复的示例。
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 让我可以找到资产 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)))
解决方案
最好将其包装在一个函数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)))
推荐阅读
- ibm-midrange - 作业批次 as400
- node.js - 我的承诺有什么问题,async/await 函数都返回空数组
- java - 如何在Java中使用字符串为变量赋值(不是评估)
- javascript - Swagger 登录“找不到用户”Node.js Express
- xml - 在 Go 中解组具有交替内容类型的 XML 元素
- javascript - Safari 推送通知点击事件句柄
- extract - 从 PST 文件中提取电子邮件和附件
- java - 如果线程当前正在执行的方法是本机的,那么当前指令地址存储在JVM中的哪里?
- mysql - Mysql 显示 100% ram 内存使用率
- sql - 我如何指定特定的飞行迁移脚本在不同的数据库上运行