r - 在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。
所以最终的输出应该存储在一个向量中。感谢您在这方面的任何帮助或更好的算法。
解决方案
因为它是一个matrix
,我们可以循环遍历apply
指定为 2 的列,然后根据 的出现MARGIN
创建一个分组变量,用于获取由创建的组分组并获取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
推荐阅读
- python - 层 PositionalEncoding 在 `__init__` 中有参数,因此必须覆盖 `get_config`
- java - 为什么在 spring-security 中,remember-me 的身份验证比完全身份验证要少?
- java - 如何在数字键释放时编辑 tableview 单元格并将按下的键放入 TextFieldTableCell?
- tensorflow - 我尝试拟合我的模型但收到此错误
- c# - 在组合框中设置 SelectedItem
- python - 如何将来自分组数据帧的值归入另一个分组数据帧?
- ruby-on-rails - 如何使用 Rspec 检查方法内的请求标头?
- javascript - 如何在我的应用程序的 two.js 画布上添加事件?
- python - 在 Python 中按列分组时出现关键错误
- php - MySQL 错误:3161 Laravel 无法创建临时表