如何无需循环创建同一data.table的多份非引用副本列表?
创建data.table多份非引用副本的简洁单行实现
问题背景
需要创建同一data.table对象的多份非引用副本列表,用于生成m个仅单列值不同的独立data.table。当前采用显式循环填充列表再修改列的方法较为繁琐,而使用dt_list <- rep(list(dt), m)会导致所有副本共享引用,修改一个时其他副本同步改变。
简洁解决方案
可以用lapply实现一行完成非引用副本创建与列值修改:
library(data.table) data("airquality") dt <- data.table(airquality) m <- 3 # 单行生成独立副本列表并修改Ozone列 dt_list <- lapply(1:m, function(i) copy(dt)[, Ozone := i])
原理说明
lapply(1:m, ...)遍历1到m的每个值,对每个i执行匿名函数,避免了显式的for循环。copy(dt)确保每次生成的都是原data.table的非引用副本,每个副本都是独立的内存对象,互不影响。- 匿名函数中直接链式调用
[, Ozone := i],在生成副本的同时完成列值修改,省去了后续单独循环修改的步骤。
验证效果
执行上述代码后,dt_list中的每个元素都是独立的data.table,各自的Ozone列分别被设置为1、2、3,修改其中任意一个不会影响其他副本。
内容的提问来源于stack exchange,提问作者Kuku
相关产品推荐
相关产品推荐

