【问题标题】:rle(): Return average of lengths only if values == TRUErle():仅当 values == TRUE 时才返回平均长度
【发布时间】:2016-12-07 01:26:11
【问题描述】:

我有以下 rle 对象:

Run Length Encoding
  lengths: int [1:189] 4 5 3 15 6 4 9 1 9 5 ...
  values : logi [1:189] FALSE TRUE FALSE TRUE FALSE TRUE ...

如果值中的相应项目 == TRUE,我想找到长度的平均值(平均值)(当值 == FALSE 时我对长度不感兴趣)

df <- data.frame(values = NoOfTradesAndLength$values, lengths = NoOfTradesAndLength$lengths)
AveLength <- aggregate(lengths ~ values, data = df, FUN = function(x) mean(x))

返回这个:

  values  lengths
1  FALSE 7.694737
2   TRUE 5.287234

我现在可以获得 values == TRUE 的长度,但是有没有更好的方法呢?或者,我可以在不使用 rle 的情况下获得类似的结果吗?从列表转换为数据框感觉有点繁琐,我相信有一种巧妙的方法可以做到这一点。我已经看到这个问题的衍生品之前已经循环过,但我无法从中找到更好的东西,因此非常感谢您的帮助。

【问题讨论】:

    标签: r


    【解决方案1】:

    rle 返回一个包含“长度”和“值”的list。我们可以使用“值”作为逻辑索引对“长度”进行子集化,并获得mean

    with(NoOfTradesAndLength, mean(lengths[values])) 
    

    使用可重现的示例

    set.seed(24)
    NoOfTradesAndLength <- rle(sample(c(TRUE, FALSE), 25, replace=TRUE))
    with(NoOfTradesAndLength, mean(lengths[values]))
    #[1] 1.5
    

    使用 OP 的代码

    AveLength[2,]
    #  values lengths
    #2   TRUE     1.5
    

    【讨论】:

    • 太棒了!比我的漂亮多了!
    • 为了其他阅读本文的人的利益,您可以通过添加 !值之前的运算符,如下所示:with(NoOfTradesAndLength, mean(lengths[!values]))
    • @FreddiE 是的,就是这样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2020-01-03
    相关资源
    最近更新 更多