0

私ができる限り試してみてください、plyrを機能させる方法がよくわかりません。この特定の例の助けと、例が機能する理由の説明に対するボーナスポイントをいただければ幸いです。

誰かがこの例を「実行可能」にしたい場合に備えて、データはここにあります

設定:

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 は、個々の値ではなく、ベクトル全体を関数に渡しているようです! これを機能させる方法についてのアドバイスと、修正が機能する理由の説明をいただければ幸いです。

前もって感謝します!

4

1 に答える 1

1

これを試して。.margin=1ここではなく、あなたが通過しなければならないと思います2。つまり、行ごとに値を渡したい場合は、.margin = 1. x[1]そしてy[1]最初に w に渡されます。w[1]そのため、 andを使用してそれらにアクセスし、w[2]それを関数に渡しますmakecoords。これがあなたの期待通りであることを願っています。そうでない場合は、コメントの下に何が問題なのかを自由に書いてください。

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
于 2013-03-28T20:02:04.143 に答える