【发布时间】:2018-01-10 01:52:05
【问题描述】:
先放一些样本数据
yr1 <- sample(0:1, 365, replace = T)
yr2 <- sample(0:1, 365, replace = T)
yr3 <- sample(0:1, 365, replace = T)
yr4 <- sample(0:1, 365, replace = T)
value <- c(yr1, yr2, yr3, yr4)
yr <- rep(2000:2003, each = 365)
doy <- rep(1:365, times = 4)
foo <- as.data.frame(cbind(value, yr, doy))
foo 包含 3 列。第 1 列具有任意值,即 1 或 0。第 2 列包含年份,第 3 列包含一年中的某一天(365 天)
我有两个向量,分别是儒略日的开始日和结束日
start <- c(258, 258,258,258)
mid <- c(279, 281,285,288)
end <- c(286, 295,300,320)
range.val <- as.data.frame(cbind(start, mid, end))
range.val$yr<- c(2000, 2001, 2002, 2003)
range.val 给了我朱利安天数,在这些天数之间我必须对 foo 中每年的值求和。
例如,对于 2000 年,我需要从 258 天到 279 天,然后从 279 到 286 对 foo$value 求和。同样,
对于 2001 年,总和 foo$value 从 258 到 281,然后从 281 到 295。
我还需要计算每年这些指数之间最长连续出现 1 的长度。
我这样做了:
for(yr in 2000:2003){
range.sub <- range.val[range.val$yr == yr,]
foo.sub <- foo[foo$yr == yr,]
sum.1 <- sum(foo.sub[range.sub$start:range.sub$mid,"value"])
sum.2 <- sum(foo.sub[range.sub$mid:range.sub$end,"value"])
length.1 <- rle(foo.sub[range.sub$start:range.sub$mid,"value"])
max.spell.length <- max(sort(length.1$lengths, , decreasing = TRUE))
length.1 <- rle(foo.sub[range.sub$mid:range.sub$start,"value"])
max.spell.length1 <- max(sort(length.1$lengths, , decreasing = TRUE))
}
在我不断努力尽量减少使用 for 循环的过程中,我想知道是否可以使用其他一些函数来缩短上述代码。
【问题讨论】: