循环以动态填充数据帧R.

时间:2018-03-26 20:49:15

标签: r loops 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)
}

我通过上面的方法收到以下错误消息。

Error in match.names(clabs, names(xi)) : 
names do not match previous names

有更简单的方法吗?

2 个答案:

答案 0 :(得分:3)

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

当您动态构建内容时,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)
}