【问题标题】:Apply function to multiple data tables将函数应用于多个数据表
【发布时间】:2015-12-26 19:21:15
【问题描述】:

我有一些结构相同的数据表,我想对它们进行一些数据转换(创建新变量、分配缺失值等)

这是我尝试过的,但没有成功。此代码运行正常,但不会更改数据表。有什么想法吗?

对于一个可重现的示例,首先运行这个 sn-p 代码

data("mtcars")              # load data
setDT(mtcars)               # convert to data table
mtcars[gear==5, gear :=NA]  # create NA values for the purpose of my application
mtcars2 <- mtcars           # create second DT

我的代码

# Create function
  computeWidth <- function(dataset){
                                    dataset$gear[is.na(dataset$gear)] <- 0 # Convert NA to 0
                                    dataset[ ,width := hp + gear]          # create new variable
                                    }

# Apply function
  lapply(list(mtcars, mtcars2), computeWidth)

如您所见,该函数工作正常,但它没有修改数据表。对此有什么想法吗?

【问题讨论】:

    标签: r data.table apply lapply


    【解决方案1】:

    您的主要问题是您使用了不正确的语法。您应该使用dataset[is.na(gear), gear := 0] 而不是dataset$gear[is.na(dataset$gear)] &lt;- 0,这样:= 将修改lapply 的词法范围之外 的原始数据集(&lt;- 只在内操作 某个函数的词法范围)。从而将您的功能修改为

    computeWidth <- function(dataset){
      dataset[is.na(gear), gear := 0] # Convert NA to 0
      dataset[ ,width := hp + gear]   # create new variable
    }
    

    然后运行

    lapply(list(mtcars, mtcars2), computeWidth) 
    

    将修改原始数据集。

    附带说明,如果您想将其推广到许多 data.table 对象,您可以查看 tables 函数并尝试以下操作

    lapply(mget(tables(silent = TRUE)$NAME), computeWidth)
    

    尽管一开始最好将许多对象保存在一个列表中,而不是用许多对象填充全局环境。


    一个非常重要的注意事项(由@Frank 建议),您应该知道,当在未修改的data.table 上使用&lt;- 时,您实际上不是创建一个新对象

    mtcars2 <- mtcars
    tracemem(mtcars)
    ## [1] "<00000000129264F8>"
    tracemem(mtcars2)
    ## [1] "<00000000129264F8>"
    

    因此,通过仅修改 mtcars,您也将修改 mtcars2。相反,正确的做法是使用copy,如

    mtcars2 <- copy(mtcars)
    tracemem(mtcars)
    ## [1] "<00000000129264F8>"
    tracemem(mtcars2)
    ## [1] "<000000001315F6B8>"
    

    更多详情请参阅here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      相关资源
      最近更新 更多