首先生成一些样本数据:
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$doy
的累积和df$value
为 >=thres
这是我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
}
}
这个循环给了我矩阵的第三列,doy
当cumsum$value
超过thres
但是,我真的很想避免循环。有什么办法可以使用更少的代码来做到这一点?