Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何将数字向量转换为包含区间的字符串_R - Fatal编程技术网

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
,这是对基本R
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"
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))