首页 > 解决方案 > 如何在 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"

标签: rfunctiondata.table

解决方案


您将遇到的一个问题是您正在创建的函数返回 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”。


推荐阅读