一些样本数据第一:
set.seed(123)
mat.1980 <- matrix(sample(0:1, replace = TRUE, size = 5L * 365L), byrow = TRUE, ncol = 5L)
set.seed(125)
mat.1981 <- matrix(sample(0:1, replace = TRUE, size = 5L * 365L), byrow = TRUE, ncol = 5L)
这就是我想要做的事情:
mat.1980
有五列。每列都是一个位置,并且在1980年的365天(365行)
值为1或0. mat.1981
是相同的数据,但是对于1981年(明年)。
我有另一个矩阵mat1
(见下文),其中有1980年的某些日子
对于mat.1980
中的每个列(位置)。
set.seed(123)
mat1 <- apply(matrix(sample(c(258:365), replace = TRUE, size = 4L * 5L), nrow = 4L), 2L, sort)
mat1[4,5] <- NA
mat1[3,3] <- 10
mat1[4,3] <- 15
mat1[4,4] <- 5
head(mat1)
# A tibble: 4 x 5
V1 V2 V3 V4 V5
<dbl> <dbl> <dbl> <dbl> <dbl>
1 289 262 306 269 262
2 302 315 307 319 284
3 343 354 10 331 293
4 353 359 15 5 NA
每列中的日期按1980年的升序排列。例如,在mat1
的第1列中,289早于
302和302早于343。但是,在第3列中,306早于307; 307早于10(这是1981年的第10天,即明年)
我需要使用mat1
来计算mat.1980
中的天数来进行计算。
以下示例:
1)对于位置1(mat.1980
和mat1
中的第一列):在mat.1980
的第1列中,
选择从289到302的天数(使用mat1
),找到最长的连续出现次数
1.重复它,这次从mat
选择从303(302 + 1)到343的天数,
找到最长的连续出现次数1.重复344到353:
选择从344(343 + 1)到353的天数,找到最长的连续出现1。
2)对所有列都这样做。
然而,问题是:对于位置3(mat1
中的第3列),由于在明年1981年出现10和15,这意味着从mat.1981
开始使用另外10天的步骤1。一个例子:
对于位置4(mat.1980
和mat1
中的第四列),找到最长的连续发生
期间308至10的1,从mat.1980
连续第308天至第365天,从mat.1981
连接第1天至第10天
然后找到最长的连续出现1.如果值为NA,则插入NA
我正在尝试使用rle函数。这就是我想要做的事情。
library(tidyverse)
mat.1980 <- as.tibble(mat.1980)
mat.1981 <- as.tibble(mat.1981)
mat1 <- as.tibble(mat1)
pmap(list(mat.1980,mat.1981,mat1), ~ {
range1 <- ..3[1]
range2 <- ..3[2]
range3 <- ..3[3]
range4 <- ..3[4]
c(range1=range1,range2=range2,range3=range3,range4=range4)
})
这为我提供了适合我的功能的日期。
现在将天数分组并对它们进行分类。
fin.dat <- pmap(list(mat.1980,mat.1981,mat1), ~ {
range1 <- ..3[1]
range2 <- ..3[2]
range3 <- ..3[3]
range4 <- ..3[4]
Val1 <- if(is.na(range1) | is.na(range2)) { # if either dates are NA, return NA
NA
} else if (range1 < range2) { # if first day comes earlier
tapply(spell.range1$lengths, spell.range1$values, max)[2] <-
spell.range1 <- rle(..1[range1:range2])
} else { # if second day comes in the next year
tapply(spell.range1$lengths, spell.range1$values, max)[2] <-
spell.range1 <- rle(dat) <- dat <- c(..1[range1:365])) ,
(..2[1:range2]))}
Val2 <- if(is.na(range2) | is.na(range3)) {
NA
} else if (range1 < range3) {
tapply(spell.range1$lengths, spell.range1$values, max)[2] <-
spell.range1 <- rle(..1[(range2+1):range3])
} else {
tapply(spell.range1$lengths, spell.range1$values, max)[2] <-
spell.range1 <- rle(dat) <- dat <- c(..1[(range2+1):365]))
, (..2[1:range3]))}
Val3 <- if(is.na(range3) | is.na(range4)) {
NA
} else if (range1 < range4) {
tapply(spell.range1$lengths, spell.range1$values, max)[2]
<- spell.range1 <- rle(..1[(range3+1):range4])
} else {
tapply(spell.range1$lengths, spell.range1$values, max)[2]
<- spell.range1 <- rle(dat) <- dat <-
c(..1[(range3+1):365])) , (..2[1:range4]))}
c(Val1 = Val1, Val2 = Val2, Val3 = Val3 )
})
我收到两个错误:
Error: object 'Val1' not found
Error: unexpected '}' in "}"
由于某种原因,我不能使用任何其他方法,我只需要应用上面的代码。所以如果有人可以在上面的代码中建议我做错了,那将是很好的。