【问题标题】:R data.table set cellwise operationR data.table 设置单元格操作
【发布时间】:2017-09-20 01:59:06
【问题描述】:

我正在尝试创建一个 data.table 的递归应用标量列表,然后将其保存到一个列表中,以便我可以使用用户定义的函数进行映射。

虚拟数据如下:

   dt <- data.table(mtcars)[1,1:3]

     ncol(dt)
     cols <- colnames(dt)

     for(j in 1:ncol(dt)){

      dt_loop <- dt
      scaled_dt <- dt_loop[,j,with=FALSE]*(1+0.01)

      #drop scaled var
      dt_loop[ , (j) := NULL ]

      jj <- cbind(scaled_dt,dt_loop)

      #go back to original order
      setcolorder(jj,cols)

      assign(paste('dt_', j, sep=''),jj, envir = .GlobalEnv)

     }

然后我想将分配的所有排列(即dt_1dt_2dt_3)保存到一个列表中,并通过paste0 以编程方式设置列表名称。

我尝试将set 运算符用于data.table,但失败了。

总的来说,我所做的似乎效率很低,应该有一种适当的方法来实现从单个 data.table 递归扩展为元素略有改变的 data.tables 列表。

如果可以为每个 dt_1dt_2dt_3 创建额外的行,则可以加分,描述对每个元素执行的操作。所以对于dt_1,它将是一个字符"mpg_+1%"

   mpg    cyl disp Delta
1: 21.21   6  160  mpg_+1%

最终列表如下所示:

dt_list <- list(dt_1 = dt_1,
                dt_2 = dt_2, 
                dt_3 = dt_3)

【问题讨论】:

    标签: r dataframe data.table


    【解决方案1】:
    lapply(names(dt), function(col)
             copy(dt)[, (col) := get(col)*1.01][, Delta := paste0(col, "_+1%")])
    #[[1]]
    #     mpg cyl disp   Delta
    #1: 21.21   6  160 mpg_+1%
    #
    #[[2]]
    #   mpg  cyl disp   Delta
    #1:  21 6.06  160 cyl_+1%
    #
    #[[3]]
    #   mpg cyl  disp    Delta
    #1:  21   6 161.6 disp_+1%
    

    【讨论】:

    • 我昨天让它工作了,但你的解决方案要优雅得多。谢谢eddi
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多