r - 识别列表中的 TRUE block

标签 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)

我想对 的值求和块 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/

相关文章:

删除大于号之间的空格

r - 使用点图可视化前/后匹配余额统计数据

r - 使用 ggplot 绘制月度数据

java - List上hashCode()的JVM优化

javascript - 为什么 'false' 在 javascript 中是真实的?

r - 在R中的plotly饼图中使用自定义图标

CSS 列表如果是十六进制则不起作用

c# - 为什么在创建新对象时 C# 链表中的值会发生变化?

python - boolean 数组元素的 AND 运算

c++ - 在不损失性能的情况下提高代码可读性