NCDef(.nc)形式の複数のファイルからデータを抽出しようとしています。私が書いたコードは、しかし、ゆっくりと、私は任意の提案に感謝したい!Slow for loop in R
私の作業コードは、temp
というファイルをRNetCDFを使用してプルし、各変数が1次元または3次元(lat、lon、およびpft)のいずれかを持つ「長いリスト」に変換します。私は一度に一つ一つの変数からそれぞれのデータを引っ張って(varlist[j]
)、それをデータフレームに変換します。次に、3つの次元のそれぞれによってこれを分割する。最後のステップは、files
を作成することで、私はcbindとrbindを使ってすべてのファイルを1つの大きなデータフレームにまとめることができます。次のように
コードは次のとおり
setwd("C:/Users/User/Box Sync/_PhD/PhD_Research/Albedo/Data_CLM/PFTRuns/2005/")
fname<-"b40.20th.1deg.bdrd.002bc.clm2.h0.2005-"
numlist<-c('01','02','03','04','05','06','07','08','09','10','11','12')
varlist<-c(1,2,4,8,9,21)
varname<-c("lon","lat","pft","pft_wtgcell","pft_wtcol","FSR")
files<-matrix(data=NA, nrow=12, ncol=length(varlist))
`for (i in 12:12) {
temp<- paste(c(fname, numlist[i],'.nc'), collapse='')
temp<-read.nc(open.nc(temp))
temp<-structure(temp, row.names = c(NA, -288), class = "data.frame")
for (j in 3:length(varlist)) {
newname<-paste(c("Y2005", numlist[i],".", varname[j]), collapse='')
if (j<4){
assign(newname, adply(temp[,varlist[j]], c(1)))}
else{
assign(newname, adply(temp[,varlist[j]], c(1,2,3)))}
files[i,j]<-newname}}`
はEDIT ここread.nc(open.nc())出力の例です。 Example Output
で、上の和解答えです。 'read.nc(open.nc(temp)'の出力のサンプルを投稿すると、データフレームへの複数の変換を避け、最後にその操作を行うことでパフォーマンスが向上する可能性があります。 dplyrが別のパフォーマンスを向上させる可能性があります。 – Dave2e
この出力を追加し、さらにコードを表示しました。 –
ループは問題ではなく、リアルタイムで消費するステップであるplyrの 'adply'ステートメントですおそらく他の人が代用関数やRcppコードを提案してパフォーマンスを改善するかもしれません。 – Dave2e