循环以动态填充数据框 R

Nic*_*lia 3 loops r dataframe

我正在运行 for 循环来动态填充数据框(我知道小海豹死在某处,因为我使用的是 for 循环)

我有这样的想法(5 是返回标量的函数的占位符):

results<-data.frame(matrix(NA, nrow = length(seq(1:10)), ncol = 
length(seq(1:10))))
rows<-data.frame(matrix(NA, nrow = 1, ncol = 1))
for (j in seq(1:10)){
rows<-data.frame()
for (i in seq(1:10)){
   rows<-cbind(rows,5)
}
results<-cbind(results,rows)
}
Run Code Online (Sandbox Code Playgroud)

我使用上述方法收到以下错误消息。

Error in match.names(clabs, names(xi)) : 
names do not match previous names
Run Code Online (Sandbox Code Playgroud)

有更容易的方法吗?

Sco*_*hie 13

使用 for 循环动态填充对象很好 - 导致问题的原因是当您使用 for 循环(例如 using和rows)动态构建对象时。cbindrbind

当您动态构建某些东西时,R 必须在每个循环中为该对象请求新内存,因为它的大小不断增加。随着对象变大,这会导致 for 循环在每次迭代时变慢。

当您预先创建对象(例如,data.frame具有正确数量的行和列)并通过索引填充它时,for 循环没有这个问题。

最后要记住的一件事是, for data.frames(and matrices) 每一列都作为一个向量存储在内存中——因此一次将它们填充到一列中通常更有效。

考虑到所有这些,我们可以按如下方式修改您的代码:

results <- data.frame(matrix(NA, nrow = length(seq(1:10)), 
                                 ncol = length(seq(1:10))))
for (rowIdx in 1:nrow(results)) {
  for (colIdx in 1:ncol(results)) {
    results[rowIdx, colIdx] <- 5 # or whatever value you want here
  }
}
Run Code Online (Sandbox Code Playgroud)