【问题标题】:Dpylr solution for cumsum with a factor reset恢复出厂设置的 cumsum 的 Dplyr 解决方案
【发布时间】:2020-11-09 09:50:27
【问题描述】:

我需要一个创建 cumsum 列的 dpylr 解决方案。

# Input dataframe
df <- data.frame(OilChanged = c("No","No","Yes","No","No","No","No","No","No","No","No","Yes","No"),
Odometer = c(300,350,410,420,430,450,500,600,600,600,650,660,700))

# Create difference column - first row starting with zero
df <- df %>% dplyr::mutate(Odometer_delta = Odometer - lag(Odometer, default = Odometer[1]))

我正在尝试根据累积总和的因子列设置重置条件。 结果需要完全像这样。

# Wanted result dataframe
df <- data.frame(OilChanged = c("No","No","Yes","No","No","No","No","No","No","No","No","Yes","No"),
                   Odometer = c(300,350,410,420,430,450,500,600,600,600,650,660,700),
                   Diff = c(0,50,60,10,10,20,50,100,0,0,50,10,40),
                   CumSum = c(0,50,110,10,20,40,90,190,190,190,240,250,40))

【问题讨论】:

    标签: r dplyr cumsum


    【解决方案1】:

    您可以在每次OilChanged == 'Yes' 时创建一个新组,并在每个组中取cumsum 的Diff 值。

    library(dplyr)
    
    df %>%
      group_by(grp = lag(cumsum(OilChanged == 'Yes'), default = 0)) %>%
      mutate(newcumsum = cumsum(Diff)) %>%
      ungroup %>%
      select(-grp)
    
    
    #  OilChanged Odometer  Diff CumSum newcumsum
    #   <chr>         <dbl> <dbl>  <dbl>     <dbl>
    # 1 No              300     0      0         0
    # 2 No              350    50     50        50
    # 3 Yes             410    60    110       110
    # 4 No              420    10     10        10
    # 5 No              430    10     20        20
    # 6 No              450    20     40        40
    # 7 No              500    50     90        90
    # 8 No              600   100    190       190
    # 9 No              600     0    190       190
    #10 No              600     0    190       190
    #11 No              650    50    240       240
    #12 Yes             660    10    250       250
    #13 No              700    40     40        40
    

    【讨论】:

    • 如果有一个因子列并且我想对我的真实因子分组执行此操作。因为 group_by 现在被占用了。如何执行此操作以使结果不会随着因子水平的变化而溢出?
    • newcumsum 溢出,因为 grp 变量在跨越因子水平时无法识别重置。我试图做 2 group_by 语句没有运气。
    • 在group_by 中添加因子变量。类似group_by(factor_column, grp = lag(cumsum(OilChanged == 'Yes'), default = 0))。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    相关资源
    最近更新 更多