我有以下的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
我现在可以获得值== TRUE的长度但是有更好的方法吗?或者,也许,我可以在不使用rle的情况下获得类似的结果吗?感觉从列表到数据帧的转换有点繁琐,我确信有一种巧妙的方法可以做到这一点。我已经看到这个问题的衍生物已经循环过去,但是我无法从中获得更好的东西,所以我们非常感谢你的帮助。
答案 0 :(得分:4)
rle
会返回list
'长度'和'值'。我们可以使用'values'作为逻辑索引对'length'进行子集化,并得到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