gpt4 book ai didi

r - 将函数应用于多个数据表

转载 作者:行者123 更新时间:2023-12-02 09:21:13 28 4
gpt4 key购买 nike

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

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

要获得可重现的示例,请先运行此代码片段

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)

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

最佳答案

您的主要问题是您使用了不正确的语法。而不是dataset$gear[is.na(dataset$gear)] <- 0你应该使用dataset[is.na(gear), gear := 0] ,这边:=将修改 lapply 词法范围之外的原始数据集( <- 仅在某个函数的词法范围内运行)。因此将您的函数修改为

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您实际上没有创建一个新对象

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了解更多详情。

关于r - 将函数应用于多个数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32841817/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com