表示阈值在矩阵列表中连续超过三列的情况

denote the occasion in which a threshold is exceed three consecutive columns in a row over a list of matrices

提问人:user11057680 提问时间:12/29/2022 最后编辑:user11057680 更新时间:12/29/2022 访问量:13

问:

我有一个矩阵列表。对于列表中的每个矩阵,我试图表示一个值连续三次< 100 的时间。最终,如果事件在序列中的任何一点连续发生三次,我只需要每个矩阵的 1,如果没有,则为 0。 我提供的代码是更高的分辨率,但我以后可以降低它。以下是我到目前为止的代码。出于某种原因,它只是在出现 1 < 100 而不是连续出现 3 次时标记为 1。我认为铅功能不合适,但目前被卡住了。我确定可以使用seq_along 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)})
R 列表 序列 lapply

评论


答:

2赞 akrun 12/29/2022 #1

我们可以在这里使用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

如果它是向量,我们可以直接应用 通过循环listrlelist

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)

评论

0赞 user11057680 12/29/2022
这是正确的答案,但是,对不起,我的例子是一个矩阵列表,但我真正的问题似乎只是一个列表,所以 double[51] 而不是 double[1x51]。我在 apply(m, 1, function(u) { 中收到错误错误:dim(X) 必须具有正长度。
0赞 akrun 12/29/2022
@user11057680你能展示 .你有向量吗?那么你不需要循环,即str(yourdata)listapplylapply(yourlist, function(u) { rl <- rle(u < 100) rl$values[(rl$lengths < 3) & rl$values] <- FALSE as.integer(inverse.rle(rl)) })
0赞 user11057680 12/29/2022
列表 10000 $ 1 : num [1:51] 59230 43245 39865 36098 34103 ... $ 2 : num [1:51] 59230 43416 39822 36168 33940 ...
0赞 akrun 12/29/2022
@user11057680这要容易得多。请检查解决方案中的更新
1赞 user11057680 12/29/2022
是的,谢谢阿克伦。我想在你打字时放弃申请。再次感谢,因为就是这样。