作者:徐修林 | 来源:互联网 | 2022-12-06 21:20
我有一个矩阵.以下是条件:
(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,第四列column = max of 10 = 10,第五列= max 20 = 20.
因此最终输出应存储在矢量中.在这方面的任何帮助或更好的算法是值得赞赏的.
1> akrun..:
因为它是a matrix
,我们可以在apply
指定MARGIN
为2的情况下遍历列,然后rle
根据出现的情况创建一个分组变量NA
,用于tapply
获取sum
按创建的组分组并获取max
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