gpt4 book ai didi

r - 为通过引用替换的 data.tables 编写高效函数

转载 作者:行者123 更新时间:2023-12-04 09:31:13 25 4
gpt4 key购买 nike

我有一个 data.table,其中包含多个二进制列,这些列具有我想在一次操作中重新编码的相同值。我修改了一个最初为 data.frames 编写的函数,但我不确定我是否真的通过修改它的方式利用了 data.table 的速度:具体来说,我怀疑该函数可能仍在复制值。

如何确保函数通过引用替换值?

这是一个玩具数据集:

# Example data:
id <- c(1,2,3,4,5)
fruit <- c("apple", "orange", "banana", "strawbery", "rasberry")
mydate <- c("2015-09-01", "2015-09-02", "2015-11-15", "2016-02-24", "2016-03-08")
eaten <- c("y", "y", "n", "y", "u")
present <- c("n", "n", "y", "y", "y")

dt <- data.table(id, fruit, mydate, eaten, present)
dt[, mydate := as.Date(mydate, format = "%Y-%m-%d")]
dt[, sex := c("m", "f", "f", "m", "f")]

# Columns to update:
bincols <- c("eaten", "present")

在重新编码之前,数据看起来是这样的:

> dt
id fruit mydate eaten present sex
1: 1 apple 2015-09-01 y n m
2: 2 orange 2015-09-02 y n f
3: 3 banana 2015-11-15 n y f
4: 4 strawbery 2016-02-24 y y m
5: 5 rasberry 2016-03-08 u y f

函数如下:

recode.multi <- function(datacols, oldval, newval) {
for (i in 1:length(datacols)) {
datacols[datacols == oldval[i]] = newval[i]
}
datacols
}

...应用于数据:

dt[, (bincols) := lapply(.SD, recode.multi, oldval = c("u", "n", "y"), newval = c(NA_real_, 0, 1)), .SDcols = bincols]

... 和输出,它根据需要更新值但不确定在此过程中是否正在复制列?

> dt
id fruit mydate eaten present sex
1: 1 apple 2015-09-01 1 0 m
2: 2 orange 2015-09-02 1 0 f
3: 3 banana 2015-11-15 0 1 f
4: 4 strawbery 2016-02-24 1 1 m
5: 5 rasberry 2016-03-08 NA 1 f

我尝试将函数中的最后一个“=”更改为“:=”,但在检查“datacols”是否为 data.table 时出现错误。在函数中添加一个子句以检查 is.data.table == TRUE 是否没有解决问题(返回相同的错误)。

任何关于最适合 data.table 的方法来处理此功能的任何想法都将不胜感激。

最佳答案

这与 Frank 的类似,但将参数传递给构建翻译向量并返回翻译的函数。您不需要在函数内部执行循环,因为 lapply:= 和 .SDcols 函数正在执行内部循环 [.data .table.

recode_dt <- function(datacol, oldval, newval) 
{ trans <- setNames(newval, oldval)
trans[ datacol ] }

dt[, (bincols) := lapply(.SD, recode_dt, oldval = c("u", "n", "y"),
newval = c(NA_real_, 0, 1)),
.SDcols = bincols]
dt
#===============
id fruit mydate eaten present sex
1: 1 apple 2015-09-01 1 0 m
2: 2 orange 2015-09-02 1 0 f
3: 3 banana 2015-11-15 0 1 f
4: 4 strawbery 2016-02-24 1 1 m
5: 5 rasberry 2016-03-08 NA 1 f

请注意,您的列实际上并不是您从评论中想到的那样的因素。如果您构建了一个 data.frame 作为中间步骤,它们可能已经存在。

关于r - 为通过引用替换的 data.tables 编写高效函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36605117/

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