【发布时间】:2018-05-26 03:05:44
【问题描述】:
首先生成一些样本数据:
doy <- rep(1:365,times=2)
year <- rep(2000:2001,each=365)
set.seed(1)
value <-runif(min=0,max=10,365*2)
doy.range <- c(40,50,60,80)
thres <- 200
df <- data.frame(cbind(doy,year,value))
我想做的是:
对于df$year == 2000,从doy.range == 40开始,开始添加
df$value,当df$value的累计和>=thres时,计算df$doy
这是我的长 for loop 来实现这一点:
# create a matrix to store results
mat <- matrix(, nrow = length(doy.range)*length(unique(year)),ncol=3)
mat[,1] <- rep(unique(year),each=4)
mat[,2] <- rep(doy.range,times=2)
for(i in unique(df$year)){
dat <- df[df$year== i,]
for(j in doy.range){
dat1 <- dat[dat$doy >= j,]
dat1$cum.sum <-cumsum(dat1$value)
day.thres <- dat1[dat1$cum.sum >= thres,"doy"][1] # gives me the doy of the year where cumsum of df$value becomes >= thres
mat[mat[,2] == j & mat[,1] == i,3] <- day.thres
}
}
当cumsum$value 超过thres 时,这个循环给了我矩阵第三列中的doy
但是,我真的很想避免循环。有什么办法可以用更少的代码做到这一点?
【问题讨论】:
标签: r for-loop apply cumsum split-apply-combine