【问题标题】:Vectorize a for loop in R向量化 R 中的 for 循环
【发布时间】:2012-12-19 21:48:19
【问题描述】:

我正在使用一个包含大约 300 万个观测值的非常大的数据集,如果某些观测值满足特定要求,我想通过并从本质上组合它们。我在下面编写了一个 for 循环来执行此操作,但效率非常低。有没有更有效的方法,比如应用函数或其他东西,可以改善这一点?

nobs <- nrow(acsdata)

for (i in 2:nobs){

  if (acsdata[i,6]==1 & acsdata[(i-1),6]==1) acsdata[(i-1),3]=2  

  if (acsdata[i,6]==1 & acsdata[(i-1),6]==1) acsdata[(i-1),21:30]=acsdata[(i-1),21:30]+acsdata[i,21:30]

  if (acsdata[i,6]==1 & acsdata[(i-1),6]==1) acsdata[(i),31]=1

}

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 您的数据正在请求列名。

标签: r loops for-loop vectorization


【解决方案1】:

只是矢量化。根本不要弄乱循环或应用函数。类似(未经测试):

to.fix <- which(acsdata[ 2:nobs, 6] == 1 & acsdata[ 1:(nobs - 1), 6] == 1)
acsdata[to.fix, 3] <- 2
acsdata[to.fix, 21:30] <- acsdata[to.fix, 21:30] + acsdata[to.fix + 1, 21:30]
acsdata[to.fix + 1, 31] <- 1

【讨论】:

  • +1,但fix 是一个函数名,所以也许将索引命名为“to.fix”?
  • 非常感谢!这正是我想要的并且非常有效。非常感谢!
  • @DWin: fix 现已修复,感谢您的关注。虽然我相信你知道,虽然不冲突是一种很好的做法,但它实际上不会导致问题,因为函数的查找方式与其他对象不同。
  • 是的。这主要是湿件的问题。
猜你喜欢
  • 1970-01-01
  • 2020-01-29
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
相关资源
最近更新 更多