程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了基于 data.table R 中的列的条件滚动差异或梯度大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决基于 data.table R 中的列的条件滚动差异或梯度?

开发过程中遇到基于 data.table R 中的列的条件滚动差异或梯度的问题如何解决?下面主要结合日常开发的经验,给出你关于基于 data.table R 中的列的条件滚动差异或梯度的解决方法建议,希望对你解决基于 data.table R 中的列的条件滚动差异或梯度有所启发或帮助;

我需要根据非常大的 data.table 中另一列的条件值来获取列的梯度。

> require(data.tablE)
> DT = data.table( ID = c(rep('A',8),rep('B',6)),Condition = c(0,1,1),Value = c(4,3,2,4,3))

我想通过 ID 获取“值”列的滚动梯度,仅适用于 Condition == 1 的行。

> desired_output
    ID Condition Value GradIEnt
 1:  A         0     4       NA    # condition isn't met so no gradIEnt
 2:  A         1     3        0    # condition is met but there is no predecessor. GradIEnt set to 0
 3:  A         0     2       NA    # condition isn't met so no gradIEnt
 4:  A         0     1       NA    # condition isn't met so no gradIEnt
 5:  A         1     4        1    # condition is met and gradIEnt is 4-3=1
 6:  A         1     3       -1    # condition is met and gradIEnt is 3-4=-1
 7:  A         0     2       NA    # condition isn't met so no gradIEnt
 8:  A         1     1       -2    # condition is met and gradIEnt is 1-3=-2
 9:  B         0     4       NA
10:  B         0     3       NA
11:  B         1     2        0
12:  B         0     1       NA
13:  B         0     4       NA
14:  B         1     3        1

如果可能,我更喜欢原生 data.table 解决方案。

请注意:可以通过子设置 DT[Condition == 1] 然后重新加入结果来做到这一点。如果可能,我想避免子设置和重新加入。

解决方法

library(data.tablE)
library(magrittr)
dt = data.table( ID = c(rep('A',8),rep('B',6)),Condition = c(0,1,1),Value = c(4,3,2,4,3))

# 1
dt[Condition == 1,Gradient := Value - shift(Value,fill = first(value)),by = ID][]
#>     ID Condition Value Gradient
#>  1:  A         0     4       NA
#>  2:  A         1     3        0
#>  3:  A         0     2       NA
#>  4:  A         0     1       NA
#>  5:  A         1     4        1
#>  6:  A         1     3       -1
#>  7:  A         0     2       NA
#>  8:  A         1     1       -2
#>  9:  B         0     4       NA
#> 10:  B         0     3       NA
#> 11:  B         1     2        0
#> 12:  B         0     1       NA
#> 13:  B         0     4       NA
#> 14:  B         1     3        1

#2
dt$grad <- c (NA,NA,-1,-2,- 1,1)

dt[Condition == 1,Value2 := Value,by = ID] %>% 
  .[,Value2 := shift(nafill(Value2,"locf"))] %>% 
  .[ Value2 != 1,Gradient2 := Value - Value2] %>% 
  .[,Value2 := NULL] %>% 
  .[]
#>     ID Condition Value Gradient grad Gradient2
#>  1:  A         0     4       NA   NA        NA
#>  2:  A         1     3        0   NA        NA
#>  3:  A         0     2       NA   -1        -1
#>  4:  A         0     1       NA   -2        -2
#>  5:  A         1     4        1    1         1
#>  6:  A         1     3       -1   -1        -1
#>  7:  A         0     2       NA   -1        -1
#>  8:  A         1     1       -2   -2        -2
#>  9:  B         0     4       NA   NA        NA
#> 10:  B         0     3       NA   NA        NA
#> 11:  B         1     2        0   NA        NA
#> 12:  B         0     1       NA   -1        -1
#> 13:  B         0     4       NA    2         2
#> 14:  B         1     3        1    1         1

由 reprex package (v2.0.0) 于 2021 年 6 月 4 日创建

大佬总结

以上是大佬教程为你收集整理的基于 data.table R 中的列的条件滚动差异或梯度全部内容,希望文章能够帮你解决基于 data.table R 中的列的条件滚动差异或梯度所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。