首页 > 解决方案 > 在R中的矩阵中处理​​NA之前和之后的值

问题描述

我有一个矩阵。以下是条件:

(1) 每列中没有四个或更多连续零的值的总和。

(2) 获取每一列的最大值并将这些最大值存储在一个向量中

例子:

v1 <- c(2,4,6,1,0)
v2 <- c(1,0,1,9,0)
v3 <- c(0,0,3,0,1)
v4 <- c(0,0,2,0,10)
v5 <- c(0,0,13,0,7)
v6 <- c(0,20,9,0,2)
mat1 <- rbind(v1, v2, v3, v4, v5, v6)
## Replace four or more zeros by NA
fill_NA <- function(X, zero_val=0, new_val= NA){   
  apply(X,2,function(x){
       r <- rle(x)
       r$values[ r$lengths > 3 & r$values == zero_val ] <- new_val
       inverse.rle(r)
      })
}
fill_NA(mat1)
 mat2 <-  fill_NA(mat1)
> mat2
 [,1] [,2] [,3] [,4] [,5]
[1,]    2    4    6    1    0
[2,]    1   NA    1    9    0
[3,]   NA   NA    3   NA    1
[4,]   NA   NA    2   NA   10
[5,]   NA   NA   13   NA    7
[6,]   NA   20    9   NA    2

现在,我想要的是找到由 NA 分隔的值总和的最大值,第一列 = 最大值 3 = 3,第二列 = 最大值 4 和 20 = 20,第三列 = 最大值 34 = 34,第四列 = 最大值 10 = 10,第五列 = 最大值 20 = 20。

所以最终的输出应该存储在一个向量中。感谢您在这方面的任何帮助或更好的算法。

标签: rmatrixsubset

解决方案


因为它是一个matrix,我们可以循环遍历apply指定为 2 的列,然后根据 的出现MARGIN创建一个分组变量,用于获取由创建的组分组并获取rleNAtapplysummax

apply(mat2, 2, function(x)  {
          rl <- rle(is.na(x))
          rl$values <- seq_along(rl$values)
          max(tapply(x, inverse.rle(rl), FUN = sum, na.rm = TRUE))
  })
#[1]  3 20 34 10 20

推荐阅读