【问题标题】:How to store and use functions in a data.table?如何在 data.table 中存储和使用函数?
【发布时间】:2021-06-07 22:47:36
【问题描述】:

将一系列函数存储在 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"

【问题讨论】:

    标签: r function data.table


    【解决方案1】:

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

    但我不确定你如何调用正确的函数,因为在上面的语句中它总是会调用第 3 个函数,因为 .N = 3。

    您可能需要一个“for”循环通过调用适当的函数来创建“列表”值,然后将列表存储回“dt”。

    【讨论】:

      猜你喜欢
      • 2017-07-11
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2014-11-11
      相关资源
      最近更新 更多