R 如何将数字向量转换为包含区间的字符串
我有一个看起来很简单的问题,但我一直没有找到一个好办法来解决它 如果我有一个数字向量,这里代表年份 例如R 如何将数字向量转换为包含区间的字符串,r,R,我有一个看起来很简单的问题,但我一直没有找到一个好办法来解决它 如果我有一个数字向量,这里代表年份 例如c(20002001200220032002005200820092010) 我希望它返回一个字符串,但不是所有的数字,因为它会很长,但可能会有间隔,因此一个字符串将返回“2000-2003、2005、2007-2010” 一般来说,有没有人有一个简单的方法可以做到这一点?这里有一个方法 nums <- c(2000,2001,2002,2003, 2005, 2007,2008,200
c(20002001200220032002005200820092010)
我希望它返回一个字符串,但不是所有的数字,因为它会很长,但可能会有间隔,因此一个字符串将返回“2000-2003、2005、2007-2010”
一般来说,有没有人有一个简单的方法可以做到这一点?这里有一个方法
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"
nums您还可以使用cgwtools
中的seqle
,这是对基本Rrle
的扩展:
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"
sekle
编码年的线性序列
并输出长度
和值
,这使我可以相当轻松地将它们相加gsub
根据需要将2005-2005
替换为2005
> seqle(year)
Run Length Encoding
lengths: int [1:3] 4 1 4
values : num [1:3] 2000 2005 2007
使用?cut
相关:,阅读剪切
功能的帮助;不要忘记通过点击下一票按钮下的灰色复选标记来接受最佳答案。您可以使用range
:toString(split(nums,cumsum(c(1,diff(nums)!=1)),function(x)ifelse(length(x)>2,paste(range(x),collapse=“-”,x))