我想知道是否有一个更干净的一行程序来创建相同data.table对象的多个副本的列表not by reference,避免了循环的需要。
这个用例是我想创建m
多个data.tables,它们之间的区别仅在于单个列的值。因此,我将创建一个包含相等对象的列表,然后迭代每个data.table并修改一列的值,最终得到m
个不同的data.table。
目前,我的笨拙不优雅的方法是:
library(data.table)
# Load data and create data.table
data("airquality")
dt <- data.table(airquality)
# Number of copies
m = 3
# Pre-allocate
dt_list <- list()
# Populate the list with `m` copies of the original data.table
for (i in 1:m) {
dt_list[[i]] <- copy(dt)
}
# Assign by reference within each data.table
for (i in 1:m) {
dt_list[[i]][, Ozone := rep(i)]
}
dt_list
# [[1]]
# Ozone Solar.R Wind Temp Month Day
# 1: 1 190 7.4 67 5 1
# 2: 1 118 8.0 72 5 2
# 3: 1 149 12.6 74 5 3
# 4: 1 313 11.5 62 5 4
# 5: 1 NA 14.3 56 5 5
# [[2]]
# Ozone Solar.R Wind Temp Month Day
# 1: 2 190 7.4 67 5 1
# 2: 2 118 8.0 72 5 2
# 3: 2 149 12.6 74 5 3
# 4: 2 313 11.5 62 5 4
# 5: 2 NA 14.3 56 5 5
# [[3]]
# Ozone Solar.R Wind Temp Month Day
# 1: 3 190 7.4 67 5 1
# 2: 3 118 8.0 72 5 2
# 3: 3 149 12.6 74 5 3
# 4: 3 313 11.5 62 5 4
# 5: 3 NA 14.3 56 5 5
其他类似的问题考虑不同的data.table对象或they assign by reference,因此当一个副本被更改时,所有副本也被更改。例如,通过执行dt_list <- rep(list(dt), m)
,所有Ozone
列都填充了3
s。
1条答案
按热度按时间jv4diomz1#
一个方法来解决你的问题: