gpt4 book ai didi

r - 性能考虑 data.table 中的 get()

转载 作者:行者123 更新时间:2023-12-03 22:49:09 24 4
gpt4 key购买 nike

我一直在循环中使用 get() 来通过 i 引用多个其他列来操作列 j。

我想知道是否有更快/更有效的方法?有任何性能考虑吗?

这是我想到的操作类型的最小示例:

require(data.table) # version 1.12.8
dt = data.table(v1=c(1,2,NA),v2=c(0,0,1),v3=c(0,0,0))
for (i in 1:2){
dt[ is.na(get(paste0('v',i))), (paste0('v',i)):= get(paste0('v',i+1))+2 ][]
}

我执行此操作的实际表要大得多(~5 mio 行,~300 列)。

我非常感谢任何想法。

最佳答案

我们可以使用set来就地分配

library(data.table)
for(j in 1:2) {
i1 <- which(is.na(dt[[j]]))
set(dt, i = i1, j = j, value = dt[[j+1]][i1]+ 2)
}

dt
# v1 v2 v3
#1: 1 0 0
#2: 2 0 0
#3: 3 1 0

如果for循环或lapply都使用get,则两者之间没有太大区别。为了提高性能,最好使用set


base R中,我们也可以这样做

setDF(dt)
i1 <- is.na(dt[-length(dt)])
dt[-length(dt)][i1] <- dt[-1][i1] + 2
dt
# v1 v2 v3
#1 1 0 0
#2 2 0 0
#3 3 1 0

关于r - 性能考虑 data.table 中的 get(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61109791/

24 4 0