如何将数字向量转换为包含间隔的字符串

时间:2017-09-23 13:22:44

标签: r

我有一个看似很简单的问题,但我找不到一个很好的解决方法。

如果我有一个数字向量,这里代表年数,

例如c(2000,2001,2002,2003, 2005, 2007,2008,2009,2010)

我希望它返回一个字符串但不包含所有数字,因为它会很长但是间隔时间可能会返回“2000-2003, 2005, 2007-2010”

一般来说,有没有人能够轻松地做到这一点?

2 个答案:

答案 0 :(得分:2)

这是一种方法。

nums <- c(2000,2001,2002,2003, 2005, 2007,2008,2009,2010)

numRanges <- function(nums){
  nums <- sort(nums) #sort in case they are in random order!
  paste(tapply(nums, 
               cumsum(c(1, diff(nums)!=1)), #grouping indicator
               function(x) paste(min(x), #first number of each group
                                 ifelse(length(x)==1, "", max(x)), #last number if required
                                 sep = ifelse(length(x)==1, "", "-"))),
        collapse=", ") #paste the above together into a single string
}

numRanges(nums)
"2000-2003, 2005, 2007-2010" 

答案 1 :(得分:0)

您还可以使用filter()中的seqle,这是对基地R cgwtools的扩展:

rle

year = c(2000,2001,2002,2003, 2005, 2007,2008,2009,2010) library(dplyr) library(cgwtools) seqle(year) %>% {paste0(.$values, "-", .$values+(.$lengths-1))} %>% toString() %>% gsub("(\\d+)[-]\\1", "\\1", .) # [1] "2000-2003, 2005, 2007-2010" seqle的线性序列进行编码,并输出yearlengths,这样我就可以轻松地将它们加在一起。 values根据需要将gsub替换为2005-2005

2005