2015-09-06 55 views
3

假設我有數的向量,其具有一些數字是在序列和一些不:R:檢測序列

x <- c(1,2,3,5,6,7,8,11,14,16,17) 

如何將操縱這使得字符串返回,使得序列分組在一起?

y <- "1-3, 5-8, 11, 14, 16-17" 

回答

5

我們創建通過使用diff比較相鄰元件分組變量(「GR」),則檢查是否輸出不爲1,執行cumsum。我們用這tapplypaste在「X」元素的range

gr <- cumsum(c(TRUE,diff(x)!=1)) 
y <- unname(tapply(x, gr, FUN= function(.x) 
        paste(unique(range(.x)), collapse='-'))) 

如果我們需要一個字符串,paste的「Y」在一起使用toString這是paste(..., collapse=', ')

y <- toString(y) 
y 
#[1] "1-3, 5-8, 11, 14, 16-17" 

我們也可以做到這一點使用任何骨料按組包裝方法。例如,使用data.table,我們將「x」至「data.table」,由「GR」(使用cumsum(...)創建)分組,我們paste的元件一起,並且如之前使用toString

library(data.table) 
y1 <- setDT(list(x))[,paste(unique(range(V1)), collapse='-') , 
       by = .(cumsum(c(TRUE, diff(V1)!=1)))]$V1 
toString(y1) 
#[1] "1-3, 5-8, 11, 14, 16-17"