如何根据一定数量的连续零值对data.frame进行分段并在R中给它们排序[重复]

2023-11-29

我目前正在处理汽车数据。我们每5分钟记录一次汽车的速度,其中包含很多零值。我的问题是,如何按零值对数据进行分段,并在 R 中为每个非零部分指定一个有序数? 我们以一个样本数据为例:

sample <- data.frame(
  id = 1:15, 
  speed = c(50,0, 0, 30, 50, 40,0, 0, 25, 30, 50, 0, 30, 50, 40))

我想添加一个新列,为每个非零部分提供一个数字(从 1 开始),而连续的 k 个零速度(或更多)编号为 0。 具体来说,对于这个示例数据,假设 k 等于 2,那么我想要的结果应该像这样的数据框:

sample_new <- data.frame(
  id = 1:15, 
  speed = c(50,0, 0, 0, 50, 40,0, 0, 25, 30, 50, 0, 30, 50, 40), 
  number = c(1, 0, 0, 0, 2, 2, 0 ,0, 3, 3, 3, 3, 3, 3, 3))

打印为

   id speed number
1   1    50      1
2   2     0      0
3   3     0      0
4   4     0      0
5   5    50      2
6   6    40      2
7   7     0      0
8   8     0      0
9   9    25      3
10 10    30      3
11 11    50      3
12 12     0      3** <- here is the difference
13 13    30      3
14 14    50      3
15 15    40      3

我的数据有超过 100 万行,所以我希望该解决方案的速度可以接受。

设置阈值“k”的原因是,一些驾驶员即使锁车并睡觉也只是将GPS打开。但在其他间隔小于 k 的情况下,他们只是因为十字路口的灯而停下来。我想专注于长时间的停留,而忽略短暂的停留。

希望我的问题对您有意义。谢谢。


由于处理速度是超过1M行的生产数据集的一个问题,我建议使用data.table.

识别后续非零条目的组非常容易:

library(data.table)
setDT(sample)[, number := rleid(speed > 0 ) * (speed > 0)][]
    id speed number
 1:  1    50      1
 2:  2     0      0
 3:  3     0      0
 4:  4    30      3
 5:  5    50      3
 6:  6    40      3
 7:  7     0      0
 8:  8     0      0
 9:  9    25      5
10: 10    30      5
11: 11    50      5
12: 12     0      0
13: 13    30      7
14: 14    50      7
15: 15    40      7

组编号不同,但编号不连续。如果这是一个要求,那就会变得棘手:

setDT(sample)[, number := as.integer(factor(rleid(speed > 0 ) * (speed > 0), exclude = 0))][]
    id speed number
 1:  1    50      1
 2:  2     0     NA
 3:  3     0     NA
 4:  4    30      2
 5:  5    50      2
 6:  6    40      2
 7:  7     0     NA
 8:  8     0     NA
 9:  9    25      3
10: 10    30      3
11: 11    50      3
12: 12     0     NA
13: 13    30      4
14: 14    50      4
15: 15    40      4

如果确实需要的话,NAs 可以替换为 0

setDT(sample)[, number := as.integer(factor(rleid(speed > 0 ) * (speed > 0), exclude = 0))][
  is.na(number), number := 0][]

还有一种替代方法

setDT(sample)[, number := {
  tmp <- speed > 0
  cumsum(tmp  - shift(tmp, fill = 0, type = "lag") > 0) * tmp
}][]
    id speed number
 1:  1    50      1
 2:  2     0      0
 3:  3     0      0
 4:  4    30      2
 5:  5    50      2
 6:  6    40      2
 7:  7     0      0
 8:  8     0      0
 9:  9    25      3
10: 10    30      3
11: 11    50      3
12: 12     0      0
13: 13    30      4
14: 14    50      4
15: 15    40      4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据一定数量的连续零值对data.frame进行分段并在R中给它们排序[重复] 的相关文章

  • 如何从闪亮模块调用闪亮模块?

    如何从闪亮模块中调用闪亮模块并传递第一个模块中的选择 作为一个例子 我编写了一个应用程序来显示星球大战主题dplyr在 DT data 表中 模块StarWars 来自同一数据集的相关电影应显示在另一个子选项卡 模块电影 的另一个 DT d
  • 如何在闪亮中使用带有reactiveValues的debounce

    我知道我可以像这样将 debounce 与reactive 结合使用 这就是我需要的行为 但我想改用reactiveValues ui lt fluidPage textInput inputId text label To see how
  • 在 R 中将列表列表转换为数据帧:Tidyverse 方式

    我正在寻找将列表列表转换为 R 中的数据帧的 Tidyverse 方法 Create a list of lists a lt seq 1 10 1 b lt seq 1 20 2 Function to calculate the sum
  • 在 Ubuntu 上安装软件包需要很长时间

    我之前使用 Windows 作为操作系统 RStudio 用于 Windows 今天切换到 Ubuntu 并再次安装了 R 和 RStudio 当我尝试从 CRAN 安装一些软件包时 仅tidyverse 使用install package
  • Foreach循环无法找到对象

    我正在尝试将 foreach 与并行后端结合使用来加速计算 用于特征选择的 AUCRF 随机森林的交叉验证 如果这确实重要的话 在这样做的过程中 我需要获取向量的子集 向量的名称可以更改 但可以作为字符向量进行访问 我使用 eval par
  • 按行重塑矩阵

    我有一个大小为 18000 x 54 的矩阵 我想将其重塑为大小为 54000 x 18 的矩阵 其中初始矩阵的每一行都变成一个有 3 行的矩阵 让我们举个例子 我有一个矩阵如下 a matrix 1 18 nrow 2 ncol 9 by
  • rpy2 在从 R 到 Python 的数据帧中处理 NA/缺失值时出现问题

    我在使用rpy2包进行转换时遇到问题dataframe将 R 中的内容保存到 Python 中 import os os environ R HOME Library Frameworks R framework Resources imp
  • 添加带有错误的弹出窗口,警告闪亮

    有什么办法可以添加一个popup 可关闭的窗口 其中包含警告或其他消息Shiny 我用来构建 Web 应用程序的 R 包 我已经寻找了一段时间但没有任何结果 虽然我不认为有任何本地可用的东西shiny 你可以尝试添加jQueryUI到您的应
  • 使用变量在 r 中像 aes_string 一样选择轴

    我试图提供一个带有列名的变量来创建一个plotly图表 类似于ggplot2 aes string 不知怎的 我被困住了 plot ly iris x Sepal Length y Sepal Width works as expected
  • RStudio 在临时目录中从 Rmarkdown 创建 PDF 文件

    我使用 RStudio 和 Rmarkdown 来创建报告 由于某种原因 使用 Knit 按钮会导致它仅在某个临时目录中创建 从命令输出来看 似乎 pandoc 本身被指示这样做 我觉得这很奇怪 usr lib rstudio bin pa
  • ggplot:按组自动化的百分位线

    我找到了dplyr gt 运算符有助于简单的 ggplot2 转换 无需求助于ggproto 这是必需的ggplot2 扩展 http docs ggplot2 org dev vignettes extending ggplot2 htm
  • 单击并按住 R 中的按钮闪亮?

    我希望能够通过单击 R 闪亮按钮来更改参数的值 所以我需要按钮 一个用于增加值 一个用于减少值 我想在按住按钮的同时保持值以一定的速度减少 增加 通过释放按钮的点击 动作应该停止 到目前为止我还没有找到这个选项actionButtons在
  • Itertools 与嵌套循环性能

    我必须生成列表中所有两对项目组合 现在 我知道有两种方法可以实现这一点 嵌套 for 循环和 python 的内置迭代工具 from itertools import combinations foo 1 2 3 4 for i in xr
  • 根据值的运行总计创建组

    我的数据在一个变量 Y 上是唯一的 另一个变量 Z 告诉我每个 Y 中有多少人 我的问题是我想从这些 Y 和 Z 创建 45 人的组 我的意思是 每当运行总计Z 达到 45 创建一组 然后代码继续创建下一组 我的数据看起来像这样 ID X
  • Quarto/Rmarkdown 中的美人鱼图:狭窄且模糊

    我正在尝试生成 pdf 格式的四开文档 稍后会生成 word 格式 我遇到了美人鱼图的问题 请在下面找到一个示例 qmd 文件来说明该问题 所以首先它应该支持 mermaid 标签 但当我这样做时 我无法在 rstudio 中 运行 单元
  • 包检查时如何有效处理未压缩的保存?

    在最近开发一个包的过程中 我将数据集包含在data 我的包的文件夹 在我的具体情况下 我有 5 个数据集 所有这些数据集都位于data table格式 尽管我在下面描述的问题仍然存在 如果我将它们保留为data frame 我已将每个人单独
  • udunits2 R 安装:找不到 udunits2.h

    我正在尝试在 R 中安装 udunits2 以满足对ggforce包裹 但是 安装程序在检查 udunits2 时始终失败 我已经尝试过中的说明this https stackoverflow com questions 47059517
  • R 中 write.table 文件名中的变量

    请帮助我解决一个幼稚的问题 已经用谷歌搜索 并尝试了很多变体 但失败了 如何使用 R 中 write table 的文件名中的变量保存文件 脚本循环遍历 dir 中的文件 应用一些函数 然后将结果保存到具有相同名称但附加结尾的文件中 谢谢
  • mclapply 用户时间大于已用时间

    我正在尝试使用mclapply的功能parallel封装在R 该函数通过计算对数似然距离将值分配给序列矩阵 这是一个 CPU 密集型操作 所结果的system time价值观令人困惑 gt system time mclapply work
  • 使用 SparkR 1.5 从 RStudio 中的 hdfs 读取大文件(纯文本、xml、json、csv)的选项

    我是 Spark 新手 想知道除了下面的选项之外是否还有其他选项可以使用 SparkR 从 RStudio 读取存储在 hdfs 中的数据 或者我是否正确使用它们 数据可以是任何类型 纯文本 csv json xml 或任何包含关系表的数据

随机推荐