r - 检测 R 中的向量何时发生真正的变化

标签 r

我有以下数据(原始数据有更多行):

structure(list(ID = 1:41, X1 = c(1921498, 2519663, 2519663, 107388, 
2519663, 52211, 2519663, 62831, 62831, 62831, 62831, 62831, 62831, 
62831, 4225203351, 4225203351, 4225203351, 4225203351, 4225203351, 
4225203351, 4225203351, 171231, 171231, 171231, 183111, 171231, 
190461, 190461, 190461, 190461, 190461, 190461, 183041, 190461, 
191151, 210321, 210321, 210321, 210321, 211051, 211051)), class = "data.frame", row.names = c(NA, 
-41L))

我正在尝试找到一种方法来检测真正发生变化的位置。例如,我知道第 4 行和第 6 行没有发生任何变化,因为我回到了经常使用的值“2519663”,然后第 8 行发生了真正的变化,因为我开始经常使用值“62831”。然后,第 15 行中发生了另一项更改,因为我开始使用值“4225203351”,而第 22 行中发生了另一项更改,因为我开始使用值“171231”,但在第 25 行中,我知道没有发生任何更改,因为我使用了值“183111”时间又回到“171231”。更改发生在第 27 行。另一个真正的更改发生在第 36 行,因为我不再使用值“190461”。我的向量中的最后一个更改位于第 40 行:

enter image description here

我的最终结果应该是这样的:

enter image description here

提前致谢!

最佳答案

这是一个基本的 R 方式。如果超过 2 个连续值存在差异,则标记为已更改。

df1 <-
  structure(list(
    ID = 1:41, 
    X1 = c(1921498, 2519663, 2519663, 107388, 
           2519663, 52211, 2519663, 62831, 62831, 62831, 62831, 62831, 62831, 
           62831, 4225203351, 4225203351, 4225203351, 4225203351, 4225203351, 
           4225203351, 4225203351, 171231, 171231, 171231, 183111, 171231, 
           190461, 190461, 190461, 190461, 190461, 190461, 183041, 190461, 
           191151, 210321, 210321, 210321, 210321, 211051, 211051)), 
    class = "data.frame", row.names = c(NA, -41L))

changes <- function(x, col, newcol, thresh = 2L) {
  r <- rle(x[[col]])
  i <- r$lengths > thresh
  r$values[!i]  <- "no change"
  rr <- inverse.rle(r)
  rr <- as.integer(factor(rr))
  j <- c(0, diff(rr)) != 0
  x[[newcol]] <- "no change"
  x[[newcol]][j] <- "change"
  x
}

changes(df1, "X1", "var3")
#>    ID         X1      var3
#> 1   1    1921498 no change
#> 2   2    2519663 no change
#> 3   3    2519663 no change
#> 4   4     107388 no change
#> 5   5    2519663 no change
#> 6   6      52211 no change
#> 7   7    2519663 no change
#> 8   8      62831    change
#> 9   9      62831 no change
#> 10 10      62831 no change
#> 11 11      62831 no change
#> 12 12      62831 no change
#> 13 13      62831 no change
#> 14 14      62831 no change
#> 15 15 4225203351    change
#> 16 16 4225203351 no change
#> 17 17 4225203351 no change
#> 18 18 4225203351 no change
#> 19 19 4225203351 no change
#> 20 20 4225203351 no change
#> 21 21 4225203351 no change
#> 22 22     171231    change
#> 23 23     171231 no change
#> 24 24     171231 no change
#> 25 25     183111    change
#> 26 26     171231 no change
#> 27 27     190461    change
#> 28 28     190461 no change
#> 29 29     190461 no change
#> 30 30     190461 no change
#> 31 31     190461 no change
#> 32 32     190461 no change
#> 33 33     183041    change
#> 34 34     190461 no change
#> 35 35     191151 no change
#> 36 36     210321    change
#> 37 37     210321 no change
#> 38 38     210321 no change
#> 39 39     210321 no change
#> 40 40     211051    change
#> 41 41     211051 no change

创建于 2022 年 11 月 26 日 reprex v2.0.2

关于r - 检测 R 中的向量何时发生真正的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74582063/

相关文章:

将一个向量提升为另一个向量的幂

javascript - 如何在 Shiny 中使用 visNetworkProxy 与基于节点 ID 的节点进行交互

r - 在哪里(如果有的话)记录了非标准评估的危险?

r - 如何比较两个数据框?

r - 计算满足这两个条件的 ID 数量

r - 在具有多列的数据框中填充缺失日期

r - igraph 对象的并集丢失属性

R中的正则化2F1超几何

r - 为什么tiff输出看起来与R studio中的ggplot2输出不同?

r - 三维数组的边际总结