【发布时间】:2019-12-24 05:43:10
【问题描述】:
我想对 data.tables 列表应用一个函数来更新几列。问题是列表中的 data.tables 最终都具有相同的更改。这是一个可重现的示例:
library(data.table)
data("mtcars")
setDT(mtcars)
# Replicate dts in a list
dt_list <- rep(list(mtcars), 4)
# My Function
update_dt <- function(i){
# new column
dt_list[[i]][, newcol := i]
# Updating column
dt_list[[i]][, mpg:= mpg + ((i-1)* 100)]
}
# Apply function
lapply(X= 1:length(dt_list), FUN= update_dt)
在这种情况下,我的 dt_list 中的所有 data.tables 最终都是相同的
【问题讨论】:
-
replicate(4, copy(mtcars))。当你把它变成一个 DT 时,它有一个单一的内存引用,并且它假定按引用语义,所以所有的变量都指向同一个内存位置。 -
或先
rep,然后再lapply(dt_list, setDT)。 -
或
rbindlist(dt_list, idcol = "newcol")[, mpg := mpg + (newcol - 1)*100][]
标签: r list function data.table