2016-12-06 41 views
1

我有以下RLE對象:RLE():返回平均長度只有當值== TRUE

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 ... 

我想找個長度的平均值(mean),如果在相應的項目值== 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的長度,但是有沒有更好的方法來做到這一點?或者,也許我可以在不使用任何軟件的情況下獲得類似的結果?從列表轉換到數據框有點繁瑣,我確信有一條巧妙的方法可以做到這一點。我已經看到,這個問題的衍生物已經循環過,但我無法從這些問題中得到更好的結果,所以您的幫助非常值得讚賞。

回答

4

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 
+1

那太好了!比我擁有的更漂亮! – Freddie

+1

爲了讀者的好處,你可以通過添加!來獲得長度值的均值= FALSE!運算符之前的值,如下所示:with(NoOfTradesAndLength,mean(lengths [!values])) – Freddie

+0

@FreddiE是的,就是這樣 – akrun