如何使R中的嵌套循环更有效

时间:2016-01-28 03:37:27

标签: r performance loops dataframe

所以基本上我在数据框中有两个独立的组:我有一个位置名称和相关的纬度和经度范围,然后我有一个精确的纬度和长值列表。我想要做的是每个EXACT lat / long对,遍历lat / long RANGE以查看该对是否在该范围内。如果是,我想写下纬度/长对旁边的位置名称。

所以,我的代码工作正常。但是,运行大约需要40分钟。我不知道这是否正常,或者我是以一种非常结构化/低效的方式做到这一点。任何想法和意见都将受到创造性的赞赏!

for (x in 1:35274) {
  lat = test[x,9]
  long = test[x,10]
  for (y in 1:1198) {
    if ((((test[y,3] <= lat) & (lat <= test[y,2])) &
         ((test[y,4] <= long) & (test[y,5] >= long))) == TRUE)
      test[x,12] <- test[y,1]
  }
}

1 个答案:

答案 0 :(得分:0)

基本上,您在此处所做的只是选择test[,9]test[,10]的前35274个条目,但您一次只能输入一个值。最好一次完成这一切:

n <- 1:35274
lat <- test[n,9]
long <- test[n,10]

然后,在你的35274循环中你再做1198个循环,这是很多运行的操作(42,258,252循环!)。这可能是您遇到问题的地方。这似乎也没有达到你想要的效果。基本上,对于任何给定的x,如果多个y满足条件,则只会写下最后的y,并且之前的任何y都将被覆盖。换句话说,如果有多个位置在纬度/经度范围内,那么只会记下一个位置。

假设您只希望每个x有一个位置,只需执行以下操作即可将此减少为1198个循环:

m <- 1198
vec <- rep(NA,m)
for (y in 1:m){
  ind <- (test[y,3] <= lat) & (test[y,2] >= lat) & (test[y,4] <= long) & (test[,5] >= long)
  vec[y] <- test[which(ind),1]
}

如果可能有多个位置,只需使用lis <- list()进行初始化,然后使用lis[y] <- test[which(ind),1]进行存储。

也许有更好的方法可以做到这一点,但这应该可以节省你很多时间。

相关问题