【问题标题】:Loop to dynamically fill dataframe R循环动态填充数据框 R
【发布时间】:2018-09-05 02:57:44
【问题描述】:

我正在运行一个 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

有没有更简单的方法?

【问题讨论】:

  • 错误信息是什么?
  • 您正在覆盖rows。这是导致错误的原因吗?数据框最后应该是什么样子 - 如果所有 5s 然后执行 data.frame(matrix(5, nrow = 10, ncol = 10))?
  • 抱歉,忘记了错误信息。
  • 5 是返回标量的函数的占位符
  • 我故意覆盖行,我只希望该函数填充那一行,将其传递给结果数据框,然后重新开始

标签: r loops dataframe


【解决方案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)
}

【讨论】:

  • 哦,是的,你完全正确。我错过了那个,谢谢!!
【解决方案2】:

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

当您动态构建某些东西时,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
  }
}

【讨论】:

    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多