如何基于它们属于R的循环来命名表

时间:2017-06-29 08:50:41

标签: r

我正在尝试创建一个循环,它在每个循环上生成新表,我希望每个表都被称为table_loopnumber,并且他们需要查看在前一个循环中创建的表。

我已经为I = 1测试了这段代码并且它工作正常,但它不能作为循环工作。任何帮助将不胜感激,因为我对R.很新。

for(i in 1:2) {    

 proj4810_op_iteration_[i+1]<-setDT(proj4810_op_iteration_i[, list(Median_High = median(unlist(.SD), na.rm = TRUE)), 
 by = list(item1, section,RL_Description_Full,
    seed_dept,
    Total_DOD,
    england_DoD,
    scotland_DoD,                                                                     
    wales_DoD,
    IOM_DoD,
    NI_DoD,
    unknown_DoD,
    turnover,
    baskets,
    items, 
    unit_price,                                                                     
    Ambient_Low, 
    Bakery_Low ,
    Cleaning_Low, 
    FTN_Low, 
    Fresh_Low, 
    FrozPrep_Low,                                                                     
    current_seedprod)])

}

提前致谢

2 个答案:

答案 0 :(得分:1)

您可以使用assign“为环境中的名称指定值”。它将第一个参数作为“变量名称,以字符串形式给出”。并作为第二个参数,您要分配给该变量名称的对象。见?assign。相反(根据其名称得到一个对象是get)。因此,以下应该有效:

for(i in 1:2){
    previous <- get(paste0("proj4810_op_iteration_", i-1) # get previous data table 
    tmp<-setDT(previous[, list(Median_High = median(unlist(.SD), na.rm = TRUE)), 
                                                       by = list(item1, section,RL_Description_Full,seed_dept,Total_DOD,england_DoD,scotland_DoD,
                                                                 wales_DoD,IOM_DoD,NI_DoD,unknown_DoD,turnover,baskets,items, unit_price,
                                                                 Ambient_Low, Bakery_Low ,Cleaning_Low, FTN_Low, Fresh_Low, FrozPrep_Low,
                                                                 current_seedprod)])
    vname <- paste0("proj4810_op_iteration_", i) # name of object to be created # name of the current data table
    assign(vname, tmp) # save the data table 
}

当然,对于第一次循环迭代,您需要在循环开始之前创建一个对象proj4810_op_iteration_0,否则它将找不到任何东西。 至于这种方法的优雅,我更赞同其他人已经发布的列表解决方案,但如果你真的想这样做,这应该可行。 请记住,下次你提问时,你提供了一个可重复性最小的例子。

答案 1 :(得分:0)

另一种方法是使用数据框列表。

以下是您解决的问题的简化版本。它涉及计算fibbonacci序列的emelents。所需的数据表是

dfList[[1]]
#   xnmo xn
# 1    1  2
dfList[[2]]
#   xnmo xn
# 1    2  3
dfList[[3]]
#   xnmo xn
# 1    3  5

因此第一个表包含序列的第一部分和第二部分。第二个表包含序列的第二部分和第三部分等。

计算此类表的循环可写如下

dfList = list(data.frame(xnmo=1, xn=1))

for(i in 1:10)
  dfList[[i+1]] = data.frame(
    xnmo = dfList[[i]]$xn,
    xn = dfList[[i]]$xnmo + dfList[[i]]$xn
  )