识别连续值中的变化类型-R
我有一个数据集,它跟踪不同类型对象随时间的数值变化。所以我有ID、measurement、yearmonth和change列。与以前的值相比,“更改”列具有发生的更改的真值。除非发生另一次更改,否则该值前后的任何常量都将标记为FALSE 我希望能够做到以下几点:识别连续值中的变化类型-R,r,change-tracking,R,Change Tracking,我有一个数据集,它跟踪不同类型对象随时间的数值变化。所以我有ID、measurement、yearmonth和change列。与以前的值相比,“更改”列具有发生的更改的真值。除非发生另一次更改,否则该值前后的任何常量都将标记为FALSE 我希望能够做到以下几点: 能够设置阈值。因此,标记任何超过特定数字的值情况。例如,如果阈值为5,则标记高于或低于该阈值的任何内容,但不要标记仅从2更改为4的情况(例如) 创建一个值发生更改的列。例如,-2表示将更改从5减少到3,2表示将更改从5增加到7
# <chr> <int> <int> <lgl>
# 1 A 2 2019-2 FALSE
# 2 A 2 2019-3 FALSE
# 3 A 2 2019-4 FALSE
# 4 A 5 2019-5 TRUE
# 5 A 5 2019-5 FALSE
# 6 A 4 2019-8 TRUE
# 7 A 4 2019-9 TRUE
# 8 B 23 2019-5 FALSE
# 9 B 7 2019-9 TRUE
#10 B 7 2020-5 FALSE
# … with 11 more rows
#
#1 A 2 2019-2错误
#2 A 2 2019-3错误
#3 A 2 2019-4错误
#4 A 5 2019-5正确
#5 A 5 2019-5错误
#6 A 4 2019-8正确
#7 A 4 2019-9正确
#8 B 23 2019-5错误
#9 B 7 2019-9正确
#10 B 7 2020-5错误
#…还有11排
此
dplyr
解决方案允许您在列中获取更改量,并且还将创建一个逻辑列,如果阈值在任一方向交叉,您将在该逻辑列中获得TRUE
。例如,在第4行中,该值已从2增加到5,因此已越过阈值。但是,在第5行中,该值保持在5,因此第4行和第5行之间的阈值没有交叉。当我们到达第6行时,该值已下降到4,这低于阈值,因此我们在这一行再次得到TRUE
为了清晰起见,我将阈值设置为4.5
库(dplyr)
阈值%
分组依据(分组)%>%
突变(变化量=c(0,差异(值)),
交叉_阈值=符号(滞后(值-阈值))=
符号(值-阈值),
crossed_thresh=ifelse(is.na(crossed_thresh)),FALSE,
交叉(脱粒)
#>#tibble:10 x 6
#>#组:组[2]
#>组值月变化变化\u交叉金额\u阈值
#>
#>1 A 2 2019-2假0假
#>2 A 2 2019-3假0假
#>3 A 2 2019-4假0假
#>4 A 5 2019-5正确3正确
#>5 A 5 2019-5假0假
#>6 A 4 2019-8正确-1正确
#>7 A 4 2019-9正确0错误
#>8 B 23 2019-5假0假
#>9 B 7 2019-9正确-16错误
#>10 B 7 2020-5错误0错误
数据
df组值月变化
#>1 A 2 2019-2错误
#>2 A 2 2019-3错误
#>3 A 2 2019-4错误
#>4 A 5 2019-5正确
#>5 A 5 2019-5错误
#>6 A 4 2019-8正确
#>7 A 4 2019-9正确
#>8 B 23 2019-5错误
#>9 B 7 2019-9正确
#>10 B 7 2020-5错误
data.table库非常有用,特别是它的移位功能
#reproduction of dataset
df <- data.table(col1 = c('A','A','A','A','A','A','A','A','A','A'),
col2 = c(2,2,2,5,5,4,4,23,7,7))
第二,我们在前一个基础上增加价值差异
df[,Identical :=(col2 == shift(col2)) ]
df[,change := col2 - shift(col2, 1)]
它提供所需的输出
col1 col2 Identical change
1: A 2 NA NA
2: A 2 TRUE 0
3: A 2 TRUE 0
4: A 5 FALSE 3
5: A 5 TRUE 0
6: A 4 FALSE -1
7: A 4 TRUE 0
8: A 23 FALSE 19
9: A 7 FALSE -16
10: A 7 TRUE 0
谢谢你@AllanCameron