我有以下数据(原始数据有更多行):
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 行:
我的最终结果应该是这样的:
提前致谢!
最佳答案
这是一个基本的 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/