2016-11-21 91 views
0

我试图将函数应用于每行的netcdf数据帧。这是脚本的阅读部分。将for循环的输出保存到数据帧

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. 任何人都可以建议如何解决这个问题的任何方法?

我会很感激任何帮助。 非常感谢,

+0

@ joel.wilson.Sorry我在R.真正的新对于每一行,有一个不同的拉姆达值。我不知道如何使用apply函数来实现它。 – ichabod

回答

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()。

如果你想加入到这个 “X”,然后使用cbind(X,as.data.frame(VEC))

+0

非常感谢您的帮助。尝试过yjPower(as.numeric(tmp_df03 [i,]),tmp_df03 $ lamb [i],并且这种方式可以正常工作,每当我应用yjPower而没有使用as.numeric时,它会给我一个错误,我不知道为什么 – ichabod

+1

'seq_along '或'1:nrow(x)' - 在 –

+0

@ joel.wilson中都没有必要。有没有办法在使用sapply函数时保留数据帧的原始格式?data.frame(vec)的输出是899列,而不是原来的363。 – ichabod