R:使用tidyverse

时间:2018-01-18 16:20:02

标签: r dplyr tidyverse purrr

一些样本数据第一:

  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.1980mat1中的第一列):在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.1980mat1中的第四列),找到最长的连续发生   期间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 "}"

由于某种原因,我不能使用任何其他方法,我只需要应用上面的代码。所以如果有人可以在上面的代码中建议我做错了,那将是很好的。

0 个答案:

没有答案