Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
识别连续值中的变化类型-R_R_Change Tracking - Fatal编程技术网

识别连续值中的变化类型-R

识别连续值中的变化类型-R,r,change-tracking,R,Change Tracking,我有一个数据集,它跟踪不同类型对象随时间的数值变化。所以我有ID、measurement、yearmonth和change列。与以前的值相比,“更改”列具有发生的更改的真值。除非发生另一次更改,否则该值前后的任何常量都将标记为FALSE 我希望能够做到以下几点: 能够设置阈值。因此,标记任何超过特定数字的值情况。例如,如果阈值为5,则标记高于或低于该阈值的任何内容,但不要标记仅从2更改为4的情况(例如) 创建一个值发生更改的列。例如,-2表示将更改从5减少到3,2表示将更改从5增加到7

我有一个数据集,它跟踪不同类型对象随时间的数值变化。所以我有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