R 中的连续引用编号:如果是连续的,则用连字符分隔数字 - 如果不是,则添加逗号

2023-11-25

我想生成连续引用数对于 R 中的数字。如果数字是连续的,则应使用连字符分隔它们。否则,数字之间用逗号分隔。例如,数字1, 2, 3, 5, 6, 8, 9, 10, 11 and 13应该出来为1-3,5,6,8-11,13.

这个问题已经被之前回答过c#,并且我编写了一个适用于 R 的函数,但是这个函数可以改进。我发布这个问题作为可能有类似需求的其他人的参考。如果您发现 R 的类似问题(我没有),请投票关闭,我将删除该问题。

下面的函数不是很优雅,但似乎可以完成工作。如何让函数变得更短、更优雅?

x <- c(1,2,3,5,6,8,9,10,11,13)

library(zoo) ## the function requires zoo::na.approx function 

##' @title Generate hyphenated sequential citation from an integer vector
##' @param x integer vector giving citation or page numbers
##' @importFrom zoo na.approx

seq.citation <- function(x) {

## Result if lenght of the integer vector is 1. 
if(length(x) == 1) return(x) else {

## Sort
x <- sort(x)

## Difference
df <- diff(x)

## Index to determine start and end points
ind <- c("start", rep("no", length(df)-1), "end")
ind[which(df > 1)] <- "end"

## Temporary start point vector
sts <- which(ind == "end") + 1
ind[sts[sts < length(ind)]] <- "start"

## Replace the first index element
ind[1] <- "start"

## Replace the last index element, if preceding one is "end"
if(ind[length(ind)-1] == "end") ind[length(ind)] <- "start"

## Groups for comma separation using "start" as the determining value.
grp <- rep(NA, length(x))
grp[which(ind == "start")] <- 1:length(grp[which(ind == "start")])
grp <- zoo::na.approx(grp, method = "constant", rule = 2)

## Split sequences by group
seqs <- split(x, grp)

seqs <- lapply(seqs, function(k) {
  if(length(k) == 1) k else {
    if(length(k) == 2) paste(k[1], k[2], sep = ",") else {
  paste(k[1], k[length(k)], sep = "-")
  }}
})

## Result
return(do.call("paste", c(seqs, sep = ",")))
}
}

seq.citation(x)
# [1] "1-3,5,6,8-11,13"

您可以通过基本 R 轻松完成此操作tapply,

paste(tapply(x, cumsum(c(1, diff(x) != 1)), function(i) 
    ifelse(length(i) > 2, paste0(head(i, 1), '-', tail(i, 1)), 
                            paste(i, collapse = ','))), collapse = ',')

[1] "1-3,5,6,8-11,13"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R 中的连续引用编号:如果是连续的,则用连字符分隔数字 - 如果不是,则添加逗号 的相关文章

随机推荐

  • Laravel DB Seeds - 测试数据与示例数据

    我可能误解了它的工作原理 但是实现此目的的最佳方法是什么 我有一些想法 但看起来很老套 我有一组示例数据 用于测试我的应用程序 这是通过 Laravel 中内置的播种器播种的 其中包含示例用户 地址 文档等内容 我还有一组应该投入生产的默认
  • 在“启动项目”期间发生内部错误。 java.lang.NullPointerException

    我的 Android 项目编译得很好 但突然停止启动 然后我尝试从项目资源管理器启动其他项目 所有项目都抛出相同的异常 An internal error occurred during Launching Project java lan
  • 哪些 HTML 标签可以与 onClick 一起使用?

    哪些 HTML 标签可以有onclick事件和哪个不能 如果有我无法包含的标签onclick我想知道为什么不活动 onclick func 有什么规则是你应该遵守的吗 所有 HTML 元素都可以有一个onclick属性 See HTML 5
  • 如何更改 vim 中 :next 和 :previous 的顺序?

    在 vim 中 我在缓冲区中打开 3 个文件 A B C 按此顺序 我要返回缓冲区 B 在 B 中打开缓冲区 D e d 所以现在我在 D 中 但是当我使用 bprevious 时 我会转到 C 但我想转到上次访问的缓冲区 B 是否可以更改
  • GitPython:如何在 GitPython 中访问提交中的文件内容

    我是 GitPython 新手 我正在尝试获取提交中文件的内容 我能够从特定提交中获取每个文件 但每次运行该命令时都会收到错误 现在 我知道该文件存在于 GitPython 中 但每次运行程序时 都会收到以下错误 returned non
  • C 编程:仅从 fgets 打印 int

    看到这个main int main void int i int ch char str 512 fgets str sizeof str stdin for i 0 i lt strlen str i if str i 0 str i n
  • 创建对象后检查是否为 null

    我正在创建一个新对象 myobject t new myobject 如果新成功 我应该检查下一行是否有空引用 if null t 或者我可以确定这个对象肯定会不同于 null Thanks 根据C 文档 if new未能成功为新对象实例分
  • 为什么要使用版本控制? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我正在读一篇博客 作者这样说 除非签入版本控制系统 否则代码就不存在 对你所做的一切使用版本控制 任何版本控制 SVN Git 甚至 CVS 掌握它并使用它 我从未使用过任何类型的版本控制
  • Jenkinsfile 中的动态参数?

    我怎样才能使用Jenkins 动态插件 in a Jenkinsfile 我正在寻找的是 Jenkinsfile 片段 启用Build with ParametersJenkins 工作中的选项 选择后 脚本将填充可使用的列表Dynamic
  • 如何更改Wildfly服务器的IP地址

    我正在准备一个在 Wildfly 上运行的程序以部署到客户站点 并且我需要更改 Wildfly 启动的 IP 地址 例如 如何将 Wildfly 配置为在 127 0 0 2 而不是 127 0 0 1 启动 Update 我在 Windo
  • Ansible:根据 stdout 中的值对异步任务执行 failed_when:

    我正在尝试执行一个failed when 基于来自标准输出的值的异步任务 这是我的任务 name RUN SOME TASK LOCALLY command
  • C#:解决继承类与其基类之间的无效转换异常

    我有两个课程 名为 帖子 和 问题 问题定义为 public class Question Post 我的 Question 类不会覆盖 Post 的任何成员 它只是表达其他一些成员 我想要完成什么 我有一个 Post 类型的对象 其成员已
  • 等待在没有异步包装器的 Chrome 控制台中工作[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我读过 MDN 的等待定义是 await 运算符用于等待 Promise 它只能在异步函数内使用 这在编辑器中有效 但是在 chrome 控制台中 我编写了一个异步函数 然后在全局执行
  • 仅使用 javaScript 对 HTML 中的表格按日期值 desc 列进行排序

    是否可以仅使用 javaScript 来实现排序功能 而不需要任何其他排序库 假设我有一个表 它的第一列具有以下格式的日期值 MM dd yyyy 表还有两列 如下所示 table width 360 border 1 thead tr t
  • 如何在网站中显示类似youtube的视频播放器?

    我正在开发一个网站 我希望上传摄像头录制的视频 并且仅对登录用户可见 但不可下载 我还想编辑视频 让某些图像出现在背景中 并可能记下他们最后一次停止观看视频的时间 也就是说 如果他们在 30 分钟后停止观看 我希望他们下次观看时从 30 0
  • python yaml更新保留顺序和注释

    我使用 python 将密钥插入到 Yaml 中 但我想保留 yaml 中的顺序和注释 This Key is used for identifying Parent tests ParentTest test JOb1 myjob nam
  • 将数据从 Python 发送到 Javascript (JSON)

    我知道 JSON 可以解决这个问题 但我在实现它时遇到了问题 这是我的方法的详细信息 数据是用Python计算的 由于数据大小是动态的 因此我需要使用 JavaScript 为输出创建额外的 HTML 表格行 因此 我需要将数据从 Pyth
  • Selenium 服务器错误:无法创建新服务 chromedriverservice

    我尝试在 Windows 10 计算机上运行 webdriverio 但在尝试运行测试 js 文件时不断遇到相同的问题 所以我运行这个 jar your download directory selenium server standalo
  • 重用WCF服务客户端

    我有一个 WCF Web 服务 充当我的 ASP NET 网页的数据提供程序 在整个网页中 通过自动生成的 ServiceClient 对 Web 服务进行了多次调用 目前 我创建一个新的 ServiceClient 并为每个请求打开它 即
  • R 中的连续引用编号:如果是连续的,则用连字符分隔数字 - 如果不是,则添加逗号

    我想生成连续引用数对于 R 中的数字 如果数字是连续的 则应使用连字符分隔它们 否则 数字之间用逗号分隔 例如 数字1 2 3 5 6 8 9 10 11 and 13应该出来为1 3 5 6 8 11 13 这个问题已经被之前回答过c 并