【问题标题】:create data table using for loop使用for循环创建数据表
【发布时间】: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


    【解决方案1】:

    我们可以使用list2env

    lst <-split(DT, DT$name)
    list2env(setNames(lst, paste0("DT_", names(lst))), envir = .GlobalEnv)
    

    但是,建议将其保存在list 中,而不是在全局环境中创建多个数据集。但是,如果这只是为了了解创建对象的可能性,可以使用list2env

    【讨论】:

      【解决方案2】:

      试试这个:

      DTs = split(DT, DT$name)
      lapply(names(DTs), function(x) assign(paste0('DT_',x), DTs[[x]], envir=.GlobalEnv))
      

      【讨论】:

      • 我有一个问题,为什么要添加.globalenv?我试图删除它,并返回了错误的结果
      • 没有它,赋值只会在函数“内部”发生。与f = function() {x = 5}; f() 无法创建变量x 的原因相同
      • 不要在lapply(或者永远,真的)中使用具有分配到全局环境的副作用的函数。
      • @Roland 原因?
      • 如果您需要函数结果列表,lapply 很有用。 (顺便说一句,如果他们必须 split 的话,这就是 OP 应该使用的,我对此表示怀疑。)否则,应该使用 for 循环。但是,像这样的副作用是您在 R 中使用错误方法的明显迹象。保持全局环境清洁您没有明确创建自己的对象。否则,您编写的代码很难调试,迟早会给您带来令人讨厌的惊喜。
      猜你喜欢
      • 2021-08-15
      • 2020-07-18
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      • 2018-07-25
      相关资源
      最近更新 更多