【问题标题】:data.table column assignments as a stored function作为存储函数的 data.table 列分配
【发布时间】:2017-06-20 06:30:01
【问题描述】:

我正在编写的 R 包中有一个非常大的表。为了减小分布的大小,我从表中删除了所有可以从其他列计算的列。例如,可以从日期计算星期几,所以我从包数据集中省略了星期几。但是,我想方便使用该包的任何人以标准方式重新计算这些列。为了提高效率,我想使用data.table 就地分配来完成。我在想象这样的事情:

dt = myPackageData  # minimal data set included in the package
extend_dow = function(your_data_table) {
  your_data_table[,`:=`(day_of_week = lubridate::wday(my_date))]
}
extend_dow(dt)

然后dt 将有day_of_week 列可供使用。

我遇到的问题是新列的就地分配似乎发生在较低级别的环境中,而我传递给函数的 data.table 实际上并没有被修改。

有谁知道我如何存储新列的完整公式,可以使用单个函数调用对用户传递给函数的同一个 data.table 应用?

【问题讨论】:

  • 该方法适用于我手动创建的 data.table。请确认它也适用于您,并且它仅不适用于使用dataset 创建的 data.table。 PS:函数内部应该是your_data_table[...
  • dataset 在哪里/如何定义?
  • 另请注意,基本 R 有一个 weekdays 函数也可以执行此操作:weekdays(as.Date("2010-01-01"))
  • @Roland 我更新了问题,因为我在函数中引用了错误的 data.table。再看看。至于表是如何打包的,它作为data.table包含在包中。但是,您不能在会话中修改包数据集,因此用户需要先进行复制。因此,公式需要将复制的表作为参数并对其进行修改。

标签: r data.table


【解决方案1】:

我想通了。我在上面发布的示例确实有效,但前提是您在将其提供给函数之前将data.table 设为data.table::copy,如下所示:

library(myPackage)
library(data.table)
dt = copy(myPackageData)
extend.weekday = function(your_data_table) {
  your_data_table[,`:=`(day_of_week = lubridate::wday(my_date))]
}
extend.weekday(dt)

我的示例中的错误是我将包数据直接分配给dt = myPackageData,而没有创建copy。在这种情况下,不会应用列扩展名。我猜这是因为对象仍在以某种方式引用包数据,这会阻止在执行函数时应用任何更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    相关资源
    最近更新 更多