2016-12-06 2 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 ... 

Я хотел бы найти среднее (среднее) длин, если соответствующий пункт в значения == 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 

я могу не w получить длину, где значения == ИСТИНА, но есть ли более хороший способ сделать это? Или, может быть, я мог бы достичь аналогичного результата без использования rle? Он чувствует себя немного странно, переходя из списков в dataframe, и я уверен, что есть одна линия умного способа сделать это. Я видел, что производные этого вопроса проносились до этого, но я не мог придумать что-либо лучше от них, поэтому ваша помощь очень ценится.

ответ

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, добавив! оператор до значений, например: с (NoOfTradesAndLength, mean (lengths [! values])) – Freddie

+0

@FreddiE Да, это он – akrun

Смежные вопросы