R语言 表示在一列矩阵中一行中连续三列超过阈值的情况

68bkxrlz  于 2023-01-03  发布在  其他
关注(0)|答案(1)|浏览(159)

我有一个矩阵列表,对于列表中的每一个矩阵,我试图表示连续三次值〈100的情况,最终我需要的是,如果事件在序列沿着的任意一点连续发生三次,则每个矩阵都为1。或者0如果它没有。我提供的代码是更高的分辨率,但我可以减少它下来以后。下面是我迄今为止的代码。由于某种原因,它只在出现〈100而不是连续出现3次时才标记1。我认为lead函数不合适,但我现在卡住了。我确信seq_沿着forloop可以使用,但我试图保持它的功能。谢谢

set.seed(24)
list_of_matrices <- replicate(100, matrix(rnorm(1*51), nrow = 1), simplify = FALSE)
test<- lapply(list_of_matrices,function(x){ifelse(x & lead(x,1) & lead(x, 2) < 100, 1, NA)})
s5a0g9ez

s5a0g9ez1#

这里我们可以使用rle

out <- lapply(list_of_matrices, function(m) {
   t(apply(m, 1, function(u)   {
         rl <- rle(u < 100)
         rl$values[(rl$lengths < 3) & rl$values] <- FALSE
         as.integer(inverse.rle(rl))
}))
})
  • 输出
> out[[1]]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    0    0    0    0    0    0    0    0    0     0
[2,]    0    0    0    0    1    1    1    1    1     0
[3,]    1    1    1    1    1    0    1    1    1     0
[4,]    0    0    0    0    0    0    0    0    0     0
[5,]    0    0    0    0    0    0    0    0    0     0

> list_of_matrices[[1]]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]  118  114   88  112  100  116  105  119  112   114
[2,]   98  108   87  116   87   97   85   86   83   100
[3,]   87   89   96   95   97  112   85   80   94   105
[4,]  102  105   87  100   91  116  114   85   82   120
[5,]  113  120   92   91  110   99  112  118   93    80

如果它是一个list的向量,我们可以通过循环list直接应用rle

lapply(lst1, function(u) {
   rl <- rle(u < 100)
   rl$values[(rl$lengths < 3) & rl$values] <- FALSE      
    as.integer(inverse.rle(rl))
  })

数据

set.seed(24)
list_of_matrices <- replicate(3, matrix(sample(80:120, 5 * 10, 
  replace = TRUE), ncol = 10, nrow = 5), simplify = FALSE)

相关问题