我正在运行一个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)
}
我通过上面的方法收到以下错误消息。
Error in match.names(clabs, names(xi)) :
names do not match previous names
有更简单的方法吗?
答案 0 :(得分:3)
使用for循环动态填充对象很好 - 导致问题的原因是当您使用for循环动态构建对象时(例如使用cbind
和rbind
行)。
当您动态构建内容时,R必须为每个循环中的对象请求新内存,因为它的大小不断增加。随着对象变大,这会导致for循环随着每次迭代而减慢。
预先创建对象(例如,具有正确行数和列数的data.frame
),并通过索引填充它时,for循环没有此问题。
最后要记住的是,对于data.frames
(和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
}
}
答案 1 :(得分:1)
不确定你的意图是什么。现在,保持您的意图和实施方式是解决问题的方法,以便更改for-loop
,以便使用第一个值初始化rows
。第二个for-loop
应来自seq(2:10)
。
发生错误是因为尝试使用有效值cbind
空白data.frame
。
for (j in seq(1:10)){
rows<-data.frame(5) #Initialization with 1st value
for (i in seq(2:10)){ #Loop 2nd on wards.
rows<-cbind(rows,5)
}
results<-cbind(results,rows)
}