我正在做一些分析的东西并使用 R。我遇到了一个问题:
我有一个逻辑列表,如下所示:
list = (TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE)
对于每个逻辑值 a 都有一个数值列表:
num = (1, 4, 3, 7, 3, 2 , 23, 98, 5)
我想对 的值求和块 TRUEs 并将它们放入矩阵或 sth 中。
就这样:
list[1] == TRUE and list[2] == TRUE and list[3] == TRUE
所以我在计算总和:1+4+3 = 8所以
matrix[1,1] <- 8
然后省略 list[4] 和 list[5] 因为它是 FALSE 并转到 list[6], matrix[2,1] <- 2
... 等等...我不知道如何提取那些 TRUE 块。我希望你能以某种方式帮助我!
最佳答案
您可以使用 rle
并执行以下操作:
myL = c(TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE)
num = c(1, 4, 3, 7, 3, 2 , 23, 98, 5)
X <- rle(myL)
Y <- rep(seq_along(X$lengths)[X$values], X$lengths[X$values])
tapply(num[myL], Y, sum)
1 3 5
8 2 103
这里,第一组
TRUE
s 总和为 8,第二组(一个值)为 2,第三组(98 和 5)总和为 103。或者,安装 my "SOfun" package from GitHub ,它有一个名为
TrueSeq
的函数这将对此有用。安装它:
library(devtools)
install_github("mrdwab/SOfun")
该函数执行以下操作:
TrueSeq(myL)
# [1] 1 1 1 0 0 2 0 3 3
这使您可以简单地执行以下操作:
tapply(num, TrueSeq(myL), sum)
# 0 1 2 3
# 33 8 2 103
或者,更好的是,使用
zero2NA
参数在 TrueSeq
, 像这样:tapply(num, TrueSeq(myL, zero2NA=TRUE), sum)
# 1 2 3
# 8 2 103
关于r - 识别列表中的 TRUE block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24692581/