我正在尝试创建一个循环,它在每个循环上生成新表,我希望每个表都被称为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)])
}
提前致谢
答案 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
)