2017-08-09 30 views
-1

我正在嘗試查找給定數據的最大中斷的起點。這是我的例子:如何自動查找給定數據集中最大中斷的起始點R

data <- data.frame(month = c(1:12), countx = c(60,69,10,13,65,80,59,84,43,21,18,10)) 
select <- data[data$countx >= 50,]   #take value greater than 50 into account  

# find the break 
wtym <- select$month 
breaks <- c(0, which(diff(wtym) != 1), length(wtym)) 
allbreak <- sapply(seq(length(breaks) - 1), 
     function(i) wtym[(breaks[i] + 1):breaks[i+1]]) 
> allbreak 
[[1]] 
[1] 1 2 
[[2]] 
[1] 5 6 7 8 

的問題是:我需要找到這對大量數據集(和休息時間明顯變化),是有什麼辦法可以自動拾取的最大起點(在這個例子中,它是5號(缺口2號)?任何想法高度讚賞。謝謝

+2

什麼是'wtym'? – www

+0

對不起,我從我原來的代碼編輯了一下,因此,缺少一行。上面是編輯。謝謝 – Hari

回答

0

聽起來像一個運行長度編碼?rle任務,你正在尋找運行x < 50x >= 50。這是一個功能:

bigbreak <- function(x, cutoff) { 
    r <- rle(x >= cutoff) 
    cumsum(r$l)[which(r$l == max(r$l[r$v]) & r$v)-1]+1 
} 

bigbreak(data$countx, 50) 
#[1] 5 

現在,讓我們嘗試在500萬個記錄:

set.seed(1) 
x <- sample(c(50,0), 5e6, replace=TRUE) 
system.time({ 
    bigbreak(x, 50) 
}) 
# user system elapsed 
# 0.41 0.00 0.41 

在半秒,不是太糟糕。

+0

太棒了!非常感謝。 我實際上運行大量數據集(大約1000個單個文件),但文件中的每個結果都有兩列數據框(如示例)。所以,如果一個文件解決了,我可以把它們放到一個循環中執行所有的操作。再次感謝。 – Hari

0

使用dplyrdata.table的解決方案。

# Create example data frame 
data <- data.frame(month = c(1:12), countx = c(60,69,10,13,65,80,59,84,43,21,18,10)) 

# Load package 
library(dplyr) 
library(data.table) 

# Process the data 
data2 <- data %>% 
    mutate(Condition = countx >= 50) %>% 
    mutate(RunID = rleid(Condition)) %>% 
    filter(Condition) %>% 
    group_by(RunID) %>% 
    mutate(num = n()) %>% 
    ungroup() %>% 
    filter(num == max(num)) 

# Show the number of the first month 
data2$month[1] 
[1] 5 
+0

太好了。似乎我需要什麼。但是當我運行時,我得到消息「錯誤在max(n):無效'參數類型'(閉包)」。你有沒有同樣的信息? – Hari

+0

請參閱我的更新。由於列名「n」和函數「n()」相似,R可能會感到困惑。我將列名從'n'改爲'num'。再試一次,看看它是否有幫助。 – www

相關問題