r - 如何在 data.table 中存储和使用函数?
问题描述
将一系列函数存储在 data.table 中然后有效地使用每个函数来产生一些结果的正确方法是什么?
# create data
dt <- data.table(name = c('a', 'b', 'c'),
value1 = c(25, 35, 45),
value2 = c(50, 60, 70),
units1 = c(100, 200, 300),
units2 = c(300, 400, 500))
# function to create row-specific functions:
get_spline_fun <- function(data){
splinefunH(
x = c(0, data[['value1']]/data[['value2']], 5),
y = c(0, data['units1']/data['units2'], 1),
m = c(1.2, 1, 0))
}
# create functions and store in a new column
dt$spline_fun <- apply(
dt[, c('value1', 'value2', 'units1', 'units2')], 1, get_spline_fun)
# create x values
x <- seq(0, 5, 0.01)
# apply functions to x values
dt[, y := spline_fun(x)]
# Results in: Error in spline_fun(x) : could not find function "spline_fun"
解决方案
您将遇到的一个问题是您正在创建的函数返回 501 个值;这不适合您尝试创建的“y”列,因为 data.table 只有 3 行。
另一个问题是,如果您查看 data.table 的结构,则 spline_fun 是一个列表,您必须引用它,例如:
dt[, y := spline_fun[[.N]](x)]
以便您在列表中应用 .Nth 函数。您将不得不有另一个对象来保存 501 行数据的 3 列,因此您可能需要重新考虑这个问题。您还可以将其存储在列表中:
dt[, y := list(spline_fun[[.N]](x))]
但我不确定你如何调用正确的函数,因为在上面的语句中它总是会调用第三个函数,因为 .N = 3。
您可能需要一个“for”循环通过调用适当的函数来创建“list”值,然后将列表存储回“dt”。