【问题标题】:Advice on plyr-ing this 'for' loop关于 plyr-ing 这个“for”循环的建议
【发布时间】:2013-03-28 18:16:14
【问题描述】:

尽我所能,我无法弄清楚如何让 plyr 工作。非常感谢您对这个特定示例的任何帮助,以及任何解释您的示例为何有效的奖励积分。

数据是here,以防万一有人想让这个例子“可行”

设置:

library(ncdf)
library(plyr)
longs = seq.int(from=1,to=4320,by=6)
lats = seq.int(from=1,to=2160,by=6)
blocksize = 6
maize.nc = open.ncdf('maize_5min.nc')

此 for 循环有效,但速度慢且不并行:

latlongcoords = NULL
for (x in 1:length(longs))  {
for (y in 1:length(lats))   {   
    lat = mean(get.var.ncdf(maize.nc,varid="latitude",start = lats[x],count = blocksize))
    lon = mean(get.var.ncdf(maize.nc,varid="longitude",start = longs[y],count = blocksize))
    rw = c(lat,lon)
    latlongcoords = rbind(latlongcoords,rw)
    }
    #print(x)
    }
save(latlongcoords,file="latlongcoords")

我想做这样的事情:

require(doMC)
registerDoMC(32)
x = seq(1:10)  #shorten it for testing purposes
y = seq(1:10)  #shorten it for testing purposes
makecoords = function(x,y){
    lat = mean(get.var.ncdf(maize.nc,varid="latitude",start = lats[x],count = blocksize))
    lon = mean(get.var.ncdf(maize.nc,varid="longitude",start = longs[y],count = blocksize))
    c(lat,lon)
    }
latlongcoords = NULL
latlongcoords = aaply(.data = cbind(x,y), .margins=2, .fun=makecoords(x,y),.parallel=TRUE)

当我运行它时,我收到以下错误消息:

Error in get.var.ncdf(maize.nc, varid = "latitude", start = lats[x], count = blocksize) : 
  Error: variable has 1 dims, but start has 10 entries.  They must match!

看起来 plyr 正在将整个向量传递给函数,而不是单个值!非常感谢您提供有关如何进行此工作的建议以及解释您的修复工作的原因!

提前致谢!

【问题讨论】:

  • 啊,对不起,忘了包括它。它是一个执行循环所做的功能。已编辑。

标签: r parallel-processing plyr netcdf


【解决方案1】:

试试这个。我认为你必须在这里传递.margin=1 而不是2。也就是说,如果您想逐行传递值,那么.margin = 1x[1]y[1] 首先传递给 w。因此,我们将使用w[1]w[2] 访问它们并将其传递给您的makecoords 函数。我希望这是你所期望的。如果没有,请随时在 cmets 下写下出了什么问题。

latlongcoords <- aaply(cbind(x,y), 1, function(w) 
                 makecoords(w[1], w[2]), .parallel=TRUE)

.parallel = FALSE 对我来说效果很好。现在无法测试.parallel=TRUE

head(latlongcoords)
# X1              1            2
#   1    89.7500025 -179.7499949
#   2    86.7500025 -176.7499949
#   3    83.7500025 -173.7499949
#   4    80.7500025 -170.7499949
#   5    77.7500025 -167.7499949
#   6    74.7500025 -164.7499949

【讨论】:

  • 不太有效:'list_to_array(res, attr(.data, "split_labels"), .drop) 中的错误:结果必须具有相同的维数。'
  • 它适用于.parallel = FALSE 的测试示例。我无法在集群上安装ncdf。无法测试.parallel = TRUE。设置为 FALSE 是否有效?
  • 其实不行。它给了我以下信息:X1 1 2 1 89.75 -179.75 2 89.25 -179.25 3 88.75 -178.75 4 88.25 -178.25 5 87.75 -177.75 6 87.25 -177.25 7 86.75 -176.75 8 86.25 -176.25 9 85.75 -175.75 10 85.25 -175.25 2x10 输入数组应该给我一个 2x100 输出数组
  • .margin=1 是按行排列的,对。当你这样做时,每一行都会被一一传递给你的函数。在这种情况下,它被分配给 w,它是您的案例的 2 个元素的向量。因此,我们需要访问 w[1] 和 w[2],因为您的函数分别接受两个参数。
猜你喜欢
  • 1970-01-01
  • 2021-12-03
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多