【问题标题】:Replace for-loop with apply()?用 apply() 替换 for 循环?
【发布时间】:2014-10-30 17:09:15
【问题描述】:

我正在尝试优化我的 R 代码,我已经开始用函数等替换已经实现“快速而肮脏”的循环。我现在已经到了一种情况,我相信 apply-function 会很方便。不过,我无法绕开它。

a <- c(10,20,15,43,76,41,25,46)
c <- c(2,5,8,3,6,1,5,6)                               
myframe <- data.frame(a,c)
newframe <-vector(length=3)
constant <- data.frame(a,c,a,a,a,a,a,a,a,a,a,a,c)

a.function <- function(frame){
  newframe <- frame*22
  return(newframe)}

result <-  matrix(nrow=nrow(myframe),ncol=3)

for(i in 1:nrow(myframe)){
  newframe <- a.function(myframe[i,])
  newframe[ncol(myframe)+1] = i 
  newframe[ncol(myframe)+2] = constant[i,9]
  #more columns added
  newframe <- rbind(result,newframe)
}

我已经尝试尽可能减少循环,希望它仍然可以被理解。 遍历数据帧的行应该是使用 for 函数的主要示例。我仍然无法让它工作。有什么想法吗?

编辑:我添加了一个工作示例。

【问题讨论】:

  • 你的预期结果是什么?
  • 你是rbind-ing 函数。这段代码没有意义。
  • 您能否发布来自my.frame 的一些数据,以便我们更好地了解您想要做什么?
  • 我们无法帮助您优化无法运行的代码。你有语法错误和未定义的对象。
  • 对不起。我现在添加了一个工作示例。我希望这会有所帮助...

标签: r loops apply


【解决方案1】:

此代码会覆盖自身。而不是保存循环的每次运行。您正在使用 myframe 中的数据在每个循环中重写 newframe。基本上你的循环唯一要做的就是运行 i 的最后一个值,即 nrow(myframe)

newframe <- a.function(myframe[nrow(myframe),])
newframe[ncol(myframe)+1] = nrow(myframe)
newframe <- rbind(newframe,newframe)

result <-  matrix(nrow=nrow(myframe),ncol=3)

甚至从未使用过。

【讨论】:

  • 对不起,示例代码是错误的。它应该是rbind(result,newframe)。我已经更改了示例...
猜你喜欢
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多