【问题标题】:Store results of a for-loop in an object or matrix将 for 循环的结果存储在对象或矩阵中
【发布时间】:2013-04-11 11:28:36
【问题描述】:

我有以下问题:

我使用 R 中的 for 循环从矩阵中获取特定数据。 我的代码如下。

for(i in 1:100){
   T <- as.Date(as.mondate (STARTLISTING)+i)
   DELIST <- (subset(datensatz_Start_End.frame, TIME <= T))[,1]

   write.table(DELIST, file = paste("tab", i, ".csv"), sep="," )
   print(DELIST)
}

使用print,R 传递数据。 使用write.table,R 将数据传送到不同的文件中。

我的目标是在 一个矩阵 中聚合 for 循环的结果。 (“i”的每一行)

但很遗憾,我做不到。


对不起,我是 R 中的真正菜鸟。

for(i in 1:100)
{
T <- as.Date(as.mondate (STARTLISTING)+i)
DELIST <- (subset(datensatz_Start_End.frame, TIME <= T))[,1]
assign(paste('b',i,sep=''),DELIST)

}

这提供了 100 个对象,其中包含我的结果。 但我需要的是 one matrix/dataframe 有 100 列或 one 列表。

有什么想法吗?


嘿!

因此我不允许编辑自己的答案,这里我的(简单)解决方案如下:

DELIST <- vector("list",100)
for(i in 1:100)

{
T <- as.Date(as.mondate (STARTLISTING)+i)
DELIST[[i]] <- as.character((subset(datensatz_Start_End.frame, TIME <= T))[,1])
}

DELIST[[99]]  ## it is possible to requist the relevant companies for every 'i'

谢谢大家!

乔治

【问题讨论】:

标签: r for-loop


【解决方案1】:

如果你想要一个列表,你可以使用lapply 而不是循环

LL <- lapply(1:100, 
       function(i) {
         T <- as.Date(as.mondate (STARTLISTING)+i)
         DELIST <- (subset(datensatz_Start_End.frame, TIME <= T))[,1]
         assign(paste('b',i,sep=''),DELIST) 
         }
       )

之后您可以使用do.callrbind 结果一起

result <- do.call(rbind, LL)

或者,如果您确信 LL 的所有元素的列都相同,那么您可以使用包 data.table 中的更高效的 rbindlist

result <- rbindlist(LL)

【讨论】:

    【解决方案2】:

    查看rbind 函数。您可以从空的DELIST.DF 开始,并将每一行附加到循环内 -

    DELIST.DF <- NULL
    for(i in 1:100){
       T <- as.Date(as.mondate (STARTLISTING)+i)
       DELIST <- (subset(datensatz_Start_End.frame, TIME <= T))[,1]
    
       DELIST.DF <- rbind(DELIST.DF, DELIST)
    
       write.table(DELIST, file = paste("tab", i, ".csv"), sep="," )
       print(DELIST)
    }
    

    【讨论】:

    • 这是错误的建议。它会很快导致second circle of R hell.
    • 显然预分配比 rbind 好(你可以在别处查看我的其他答案)。但它不是黑色/白色。可以使用 rbind 进行 100 次迭代。您可以查看您链接的 pdf 中的表格。
    • 它还取决于被“rbind”编辑的对象的大小。一般来说,在循环中增长对象是非常不明智的。
    • 是吗?上次我检查时,malloc 花费的时间与对象大小无关。我同意一般来说这是一种不好的做法,但特别是(
    • 我的意思是memory usage,这是这里的主要关注点。据我了解,rbind 创建了要绑定的对象的临时副本,因此不需要迭代,因此需要内存的指数增长。
    猜你喜欢
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 2014-01-09
    • 1970-01-01
    相关资源
    最近更新 更多