我正在运行 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)动态构建对象时。cbind
rbind
当您动态构建某些东西时,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)