在列表中标识TRUE块

时间:2014-07-11 07:46:05

标签: r list boolean logical-operators

我正在做一些分析并使用R.我遇到了一个问题:

我有一个逻辑列表,如下所示:

list = (TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE)

对于每个逻辑值a都有一个数值列表:

num = (1, 4, 3, 7, 3, 2 , 23, 98, 5)

我想对TRUE的的值求和,并将它们放在矩阵中或者是......

就像那样:

list[1] == TRUE and list[2] == TRUE and list[3] == TRUE所以我正在计算总和:1 + 4 + 3 = 8 所以matrix[1,1] <- 8然后省略列表[4]和列表[5],因为它是FALSE并转到列表[6],matrix[2,1] <- 2 ......等等......

我不知道如何提取这些TRUE块。我希望你能以某种方式帮助我!

2 个答案:

答案 0 :(得分:4)

您可以使用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总和为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

答案 1 :(得分:1)

要找到这些块,您可以使用diff这样的功能:

vec = c(TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE)
c(vec[1]==TRUE,diff(vec))
## [1]  1  0  0 -1  0  1 -1  1  0

当有1时,块开始,你添加元素直到有0. -1表示假块开始的位置。