(更新)基于两列向data.frame添加索引列

2023-12-07

示例数据框:

df = read.table(text = 'colA colB
                2 7
                2 7
                2 7
                2 7
                1 7
                1 7
                1 7
                89 5
                89 5
                89 5
                88 5
                88 5
                70 5
                70 5
                70 5
                69 5
                69 5
                44 4
                44 4
                44 4
                43 4
                42 4
                42 4
                41 4
                41 4
                120 1
                100 1', header = TRUE)

我需要添加一个基于的索引列colA and colB where colB显示要分组的确切行数,但可以重复。colB根据以下条件对行进行分组colA and colA -1.

预期输出:

 colA colB index_col
    2 7       1
    2 7       1
    2 7       1
    2 7       1
    1 7       1
    1 7       1
    1 7       1
    89 5      2
    89 5      2
    89 5      2
    88 5      2
    88 5      2
    70 5      3
    70 5      3
    70 5      3
    69 5      3
    69 5      3
    44 4      4
    44 4      4 
    44 4      4
    43 4      4
    42 4      5
    42 4      5
    41 4      5
    41 4      5
   120 1      6
   100 1      7

UPDATE

我如何调整适用于上述内容的代码df出于同样的目的,但通过查看colB值分组基于colA, colA -1 and colA -2?即(考虑 3 天而不是 2 天)

new_df = read.table(text = 'colA colB
        3 10
        3 10
        3 10      
        2 10
        2 10
        2 10
        2 10
        1 10
        1 10
        1 10
        90 7
        90 7
        89 7
        89 7
        89 7
        88 7
        88 7
        71 7
        71 7
        70 7
        70 7
        70 7
        69 7
        69 7
        44 5
        44 5
        44 5
        43 5
        42 5
        41 5
        41 5
        41 5
        40 5
        40 5
       120 1
       100 1', header = TRUE)

预期输出:

     colA colB index_col
        3 10      1
        3 10      1
        3 10      1
        2 10      1
        2 10      1
        2 10      1
        2 10      1
        1 10      1
        1 10      1
        1 10      1
        90 7      2
        90 7      2
        89 7      2
        89 7      2
        89 7      2
        88 7      2
        88 7      2
        71 7      3
        71 7      3
        70 7      3
        70 7      3
        70 7      3
        69 7      3
        69 7      3
        44 5      4
        44 5      4
        44 5      4
        43 5      4
        42 5      4
        41 5      5
        41 5      5
        41 5      5
        40 5      5
        40 5      5
       120 1      6
       100 1      7

Thanks


我们可以用rleid

library(data.table)
index_col <-setDT(df)[, if(colB[1L] < .N) ((seq_len(.N)-1) %/% colB[1L])+1  
       else as.numeric(colB), rleid(colB)][, rleid(V1)]
df[, index_col := index_col]
df
#    colA colB index_col
# 1:    2    7         1
# 2:    2    7         1
# 3:    2    7         1
# 4:    2    7         1
# 5:    1    7         1
# 6:    1    7         1
# 7:    1    7         1
# 8:   70    5         2
# 9:   70    5         2
#10:   70    5         2
#11:   69    5         2
#12:   69    5         2
#13:   89    5         3
#14:   89    5         3
#15:   89    5         3
#16:   88    5         3
#17:   88    5         3
#18:  120    1         4
#19:  100    1         5

或者单行会是

setDT(df)[, index_col := df[, ((seq_len(.N)-1) %/% colB[1L])+1, rleid(colB)][, as.integer(interaction(.SD, drop = TRUE, lex.order = TRUE))]]

Update

基于 OP 帖子中的新更新

setDT(new_df)[, index_col :=  cumsum(c(TRUE, abs(diff(colA))> 1))
          ][, colB := .N , index_col]
new_df
#    colA colB index_col
# 1:    3   10         1
# 2:    3   10         1
# 3:    3   10         1
# 4:    2   10         1
# 5:    2   10         1
# 6:    2   10         1
# 7:    2   10         1
# 8:    1   10         1
# 9:    1   10         1
#10:    1   10         1
#11:   71    7         2
#12:   71    7         2
#13:   70    7         2
#14:   70    7         2
#15:   70    7         2
#16:   69    7         2
#17:   69    7         2
#18:   90    7         3
#19:   90    7         3
#20:   89    7         3
#21:   89    7         3
#22:   89    7         3
#23:   88    7         3
#24:   88    7         3
#25:   44    2         4
#26:   43    2         4
#27:  120    1         5
#28:  100    1         6
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(更新)基于两列向data.frame添加索引列 的相关文章

随机推荐

  • 根据变量范围过滤数据透视表

    我的目标是使用另一张工作表中的范围来过滤数据透视表 该范围从第三张表中提取数据 这是启动大量公式并在每次使用时发生变化的数据转储 我有下面的代码 但我可以看到它所做的是运行每个数据透视表字段 将其与范围进行比较 然后删除过滤器 我有 32
  • 如何使用固定点旋转 UIIMageVIew?

    我想按角度旋转图像 但是我想用固定点旋转图像 如何设置这个固定点 设置视图图层的锚点 该锚点位于视图局部坐标中 范围为 0 到 1 即左上角为 0 0 右下角为 1 1 例如 默认是绕中心旋转 imageView layer anchorP
  • 错误:运行 docker 容器时无法访问 jarfile

    尝试运行 docker 容器时出现以下错误 Error Unable to access jarfile 我的 Dockerfile 是这样的 FROM ubuntu 16 04 Install Updates RUN apt get up
  • 如何缓存 IQueryable 对象?

    我有这个方法 它返回 UserStatus 表中所有行的 Linq to SQL 查询 public IQueryable
  • 确定 ABAP 中的活动格式设置

    As the 格式化设置的ABAP文档解释 格式设置设置如下 在内部会议开始时 他们是由相关默认设置决定当前用户的用户主记录中的固定值 使用语句 SET COUNTRY 这是当前内部会话的默认设置可以使用特定于国家 地区的格式进行覆盖 但作
  • R - 当我绘制 xts 和 Zoo 对象时如何更改日期格式?

    我想知道如何更改日期格式 我正在处理的代码如下 library quantmod getSymbols AAPL price AAPL lt AAPL 6 plot price AAPL main The price of AAPL 这个结
  • 接收者未注册

    我有一个带有异步任务的程序和一个广播接收器来发送结果代码 以便 Asynctask 知道应用程序正在工作 但它崩溃了 说接收者在主要活动中未注册 我在主活动中注册了一个接收器 另一个接收器在 AsyncTask 活动中注册 所以这里是代码和
  • 从链接 Google Map API 中提取坐标

    有没有办法使用这种类型的谷歌地图链接检索纬度和经度 https goo gl maps 7jNqZtPa5Cjf333k7 在这个网址中7jNqZtPa5Cjf333k7不是指地点ID吗 我真的很难使用这种类型的链接来提取纬度和经度 如果有
  • 自 2022 年 10 月 VS-Code 更新(版本 1.73)起安装的新 isort 扩展出现问题

    我在 Windows 10 Pro Build 10 0 19045 上使用 VS Code 版本 1 73 1 带有 MS Python 扩展 v2022 18 2 安装 VS Code 2022 年 10 月更新后 在编写 Python
  • 将多行字符串中的指定列转换为单个逗号分隔行

    假设我有以下字符串 something1 12 0 some unnecessary trailing data this must go something2 15 5 some more unnecessary trailing dat
  • 导出带有资源的 jar

    我正在尝试通过构建许多小型模块化项目来构建大型 Java 项目 我希望每个小项目都是完全独立的 拥有其所有资源 例如图像 我正在使用 Eclipse 如果我配置构建路径来添加模块化项目之一 资源引用将不起作用 该系统找不到指定的文件 如果我
  • 如何让 Git 不列出修改过的更改?

    Git status 会给我已更改的文件列表 其中我有一些已更改但我不想提交 只需将其保留在工作目录中即可 令人烦恼的是 在提交之前 如果有新的更改 我必须扫描这些文件的差异 或者这些修改只是我知道的并且不想提交的修改 有没有办法告诉 Gi
  • JavaScript 读取文件内容

    如果您有新文档的 url 如何使用 javascript 从不是您所在页面的文档中检索数据 我想做的是创建一个页面 其中有一个用于提供本地文件名的文本字段和一个从所提供的文档中检索单词的按钮 thanks HTML5 有一个文件 API 可
  • 从资源中排除属性文件

    如何从 src main resources 中排除文件 例如 我在那里有一个名为 map 的文件夹 我想保留它 并且我想删除 war 中的所有内容 或者不首先将其打包到里面 或者替代但结果相同 从 src main resources 中
  • asp.net web 配置错误

    我的 ASP NET 项目仍然有问题 在 Visual Studio 中 当我开始调试时 一切正常并且页面正常工作 但是 当我在 iis7 上尝试时 会显示此错误 显示错误 配置错误描述 处理服务此请求所需的配置文件期间发生错误 请查看下面
  • C#:HttpListener 提供内容时出错

    我已经实现了类似的东西this唯一真正的区别是 string filename context Request RawUrl Replace Remove 0 1 string path Uri UnescapeDataString Pat
  • 从 javascript 调用 Objective-C 方法

    我制作任何 webView 并且我想从 javascript 调用任何返回任何参数的目标 c 方法 我尝试了很多方法但不允许 Objective C 方法在这里 BOOL webView UIWebView webView shouldSt
  • java 的 PriorityQueue 的内置迭代器不会以任何特定顺序遍历数据结构。为什么?

    这是直接来自Java文档 此类及其迭代器实现了 Collection 和 Iterator 接口的所有可选方法 iterator 方法中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素 如果需要有序遍历 请考虑使用 Arrays sor
  • Base 64 图像到 ocr.space API Ionic 2

    我正在尝试将 Base 64 Jpeg 发送到 API 进行 OCR 分析 API 文档可以在这里找到https ocr space ocrapi 保存图像的代码在这里 takePicture Camera getPicture desti
  • (更新)基于两列向data.frame添加索引列

    示例数据框 df read table text colA colB 2 7 2 7 2 7 2 7 1 7 1 7 1 7 89 5 89 5 89 5 88 5 88 5 70 5 70 5 70 5