提问人:user11057680 提问时间:12/29/2022 最后编辑:user11057680 更新时间:12/29/2022 访问量:13
表示阈值在矩阵列表中连续超过三列的情况
denote the occasion in which a threshold is exceed three consecutive columns in a row over a list of matrices
问:
我有一个矩阵列表。对于列表中的每个矩阵,我试图表示一个值连续三次< 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)})
答:
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
如果它是向量,我们可以直接应用 通过循环list
rle
list
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)
list
apply
lapply(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
是的,谢谢阿克伦。我想在你打字时放弃申请。再次感谢,因为就是这样。
评论