2016-03-23 55 views
1

例如,假設一個具有此data.frame什麼是一個很好的方式來找到data.frame中連續出現的事件的最大數量?

set.seed(1) 
x = data.frame(foo=letters, bar=as.integer((rnorm(26) > 0.5))) 

在這個例子中,1最大連續條紋發生的行18和22(含)之間。我想知道的是,鑑於更大的框架,是否有一種很好的方法來確定這樣的點?我通常使用表和dplyr,並試圖cumprodcumsum具有特殊的價值,但這兩種方法似乎並沒有削減它。

+0

預期產量是多少?你想查找最大的連勝數或行數嗎? – akrun

+0

@akrun兩人,雖然知道行數是微不足道的,然後得到最大的連勝。 –

回答

3

這裏的另一種方式:

with(rle(x$bar), { 
    w = which.max(lengths*(values==1)) 
    cumsum(c(1L,lengths))[w+0:1] - 0:1 
}) 
# 18 22 

工作原理:

我們希望的values==1運行是最長的。由於真/假在R中乘以1/0,所以這是最大化運行lengths*(values==1)。將此稱爲w

cumsum(c(1L,lengths))包含每次運行的起始位置,再加上一個額外的元素1L+length(x$bar)。如果我們選擇w th元素,我們有跑步的起始位置。如果我們選擇w+1 th元素並從中減去一個元素,我們就得到了該結果的位置。

+1

謝謝,我發現在我的48幀中最長的連勝,工作完美! –

2

我們可以使用rle來獲取vector(或列)中相同元素的長度和值。獲得「長度」的邏輯索引,它等於「值」的最大長度爲1.取反,並將這些值分配給0.使用inverse.rle,我們得到原始長度爲vector。要找到不是0的元素,請使用which並使用sum來計算。

v1 <- inverse.rle(within.list(rle(x$bar), 
    values[!(lengths==max(lengths[values==1]) & values!=0)] <- 0)) 
which(v1!=0) 
#[1] 18 19 20 21 22 
sum(v1) 
#[1] 5 
+0

這是如此之強 –

+0

弗蘭克是對的,我的向量正在運行(這是近200,000長度) –

+1

@弗蘭克感謝您的建議。 – akrun

相關問題