【发布时间】:2016-12-29 03:13:56
【问题描述】:
假设我有一个data.table
DT=data.table(name = sample(letters[1:25],30,replace=T), value =rnorm(3000))
我想按名称拆分 DT 并创建新的 DT,例如名称 DT_a,DT_b 对应于名称值。那我该怎么做呢?
【问题讨论】:
标签: r for-loop data.table
假设我有一个data.table
DT=data.table(name = sample(letters[1:25],30,replace=T), value =rnorm(3000))
我想按名称拆分 DT 并创建新的 DT,例如名称 DT_a,DT_b 对应于名称值。那我该怎么做呢?
【问题讨论】:
标签: r for-loop data.table
我们可以使用list2env
lst <-split(DT, DT$name)
list2env(setNames(lst, paste0("DT_", names(lst))), envir = .GlobalEnv)
但是,建议将其保存在list 中,而不是在全局环境中创建多个数据集。但是,如果这只是为了了解创建对象的可能性,可以使用list2env。
【讨论】:
试试这个:
DTs = split(DT, DT$name)
lapply(names(DTs), function(x) assign(paste0('DT_',x), DTs[[x]], envir=.GlobalEnv))
【讨论】:
f = function() {x = 5}; f() 无法创建变量x 的原因相同
lapply(或者永远,真的)中使用具有分配到全局环境的副作用的函数。
lapply 很有用。 (顺便说一句,如果他们必须 split 的话,这就是 OP 应该使用的,我对此表示怀疑。)否则,应该使用 for 循环。但是,像这样的副作用是您在 R 中使用错误方法的明显迹象。保持全局环境清洁您没有明确创建自己的对象。否则,您编写的代码很难调试,迟早会给您带来令人讨厌的惊喜。