我有一个看似很简单的问题,但我找不到一个很好的解决方法。
如果我有一个数字向量,这里代表年数,
例如c(2000,2001,2002,2003, 2005, 2007,2008,2009,2010)
我希望它返回一个字符串但不包含所有数字,因为它会很长但是间隔时间可能会返回“2000-2003, 2005, 2007-2010”
。
一般来说,有没有人能够轻松地做到这一点?
答案 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
的线性序列进行编码,并输出year
和lengths
,这样我就可以轻松地将它们加在一起。 values
根据需要将gsub
替换为2005-2005
。
2005