R语言 如何在不循环的情况下制作同一data.table的多个副本的列表?(且不通过引用赋值)

0qx6xfy6  于 2023-05-04  发布在  其他
关注(0)|答案(1)|浏览(132)

我想知道是否有一个更干净的一行程序来创建相同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。

jv4diomz

jv4diomz1#

一个方法来解决你的问题:

dt_list = lapply(1:3, \(i) copy(dt)[, Ozone := i])
# or
dt_list = lapply(1:3, \(i) set(copy(dt), j="Ozone", value=i))

[[1]]
     Ozone Solar.R  Wind  Temp Month   Day
     <int>   <int> <num> <int> <int> <int>
  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
 ---                                      
149:     1     193   6.9    70     9    26
150:     1     145  13.2    77     9    27
151:     1     191  14.3    75     9    28
152:     1     131   8.0    76     9    29
153:     1     223  11.5    68     9    30

[[2]]
     Ozone Solar.R  Wind  Temp Month   Day
     <int>   <int> <num> <int> <int> <int>
  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
 ---                                      
149:     2     193   6.9    70     9    26
150:     2     145  13.2    77     9    27
151:     2     191  14.3    75     9    28
152:     2     131   8.0    76     9    29
153:     2     223  11.5    68     9    30

[[3]]
     Ozone Solar.R  Wind  Temp Month   Day
     <int>   <int> <num> <int> <int> <int>
  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
 ---                                      
149:     3     193   6.9    70     9    26
150:     3     145  13.2    77     9    27
151:     3     191  14.3    75     9    28
152:     3     131   8.0    76     9    29
153:     3     223  11.5    68     9    30

相关问题