将for循环的输出保存到数据框

时间:2016-11-21 05:23:15

标签: r for-loop dataframe netcdf

我正在尝试将函数应用于每行的netcdf数据帧。这是脚本的阅读部分。

library(ncdf4)
library(car)
library(forecast)
ncname <- "plus1"             
ncfname <- paste(ncname,".nc", sep="")
dname <- "precip"
ncin <- nc_open(ncfname)
lon <- ncvar_get(ncin,"lon")
nlon <- dim(lon)
lat <- ncvar_get(ncin,"lat",verbose=F)
nlat <- dim(lat)
t <- ncvar_get(ncin,"time")
tunits <- ncatt_get(ncin,"time","units")
nt <- dim(t)
tmp_array <- ncvar_get(ncin,dname)
nc_close(ncin)
tmp_vec_long <- as.vector(tmp_array)
tmp_mat <- matrix(tmp_vec_long, nrow=nlon*nlat, ncol=nt)
lonlat <- as.matrix(expand.grid(lon,lat))
tmp_df02 <- data.frame(cbind(lonlat,tmp_mat))
tmp_df03<-na.omit(tmp_df02)

tmp_df03$lamb<-apply(tmp_df02[3:365],1,function(x)BoxCox.lambda(x,method="loglik",lower=-2,upper=2))

我想使用列tmp_df03 $ lamb中的值并申请数据框的每一行。例如(x应该是数据框的名称):

trans<-yjPower(x,tmp_df03$lamb,jacobian.adjusted=TRUE)

如果我把它放在for循环中:

d<-matrix(ncol=363,nrow=899)
for (i in 1:899){
trans[i]<-yjPower(as.numeric(tmp_df03[i,][3:365]),tmp_df03$lamb[i],jacobian.adjusted=TRUE)
d<-rbind(d,trans) 
}

我遇到了以下警告信息。

警告讯息:

1: In trans[i] <- yjPower(as.numeric(tmp_df03[i, ][3:365]), tmp_df03$lamb[i],  :

要替换的项目数不是替换长度的倍数

问题:

  1. 如何组合for循环的输出并创建结果的新数据框?
  2. 任何人都可以建议如何解决这个问题?
  3. 我会感激任何帮助。 非常感谢,

1 个答案:

答案 0 :(得分:0)

使用sapply() - 我不太了解yjPower(),所以只是给你一个提示!

vec <- sapply(1:nrow(x), function(i) yjPower(x[i,], tmp_df03$lamb[i], jacobian.adjusted = TRUE))

所以上面的代码将给出一个向量:将其作为data.frame,在此向量上使用as.data.frame()。

如果你想加入这个&#34; x&#34;然后使用cbind(x,as.data.frame(vec))

相关问题