我正在做一些分析并使用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块。我希望你能以某种方式帮助我!
答案 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表示假块开始的位置。