【问题标题】:taking lag and capping the values with mean in dplyr在 dplyr 中采用延迟并用平均值限制值
【发布时间】:2018-03-22 16:23:30
【问题描述】:

我在 r 中有以下数据框

   name    date         month    year     hours
   SSI     01-01-2016   01       2016      2000
   SSI     02-01-2016   01       2016      1900
   SSI     03-01-2016   01       2016      2038
   SSI     04-01-2016   01       2016      2041
   SSII    01-01-2016   01       2016      2000
   SSII    02-01-2016   01       2016      2100
   SSII    03-01-2016   01       2016      2105
   SSII    04-01-2016   01       2016      2203

我想为每个名称 group by 计算 lag of hours 月份和年份。我可以使用以下代码来完成

  df1 <- df %>% 
    group_by(name,year,month) %>% 
    mutate(running_hrs = hours- lag(hours)) %>% 
    as.data.frame()

我想要的是running_hrs 大于 24 或小于 0,我想用当月的平均值来限制这些值。我正在关注。

  new_df <- df%>% 
    group_by(name,year,month) %>% 
    mutate(running_hrs = hours- lag(hours)) %>% 
    mutate(running_hrs_new = ifelse(running_hrs > 24 | running_hrs < 0,mean(running_hrs),running_hrs)) %>% 
    as.data.frame()

   name    date         month   year    hours   running_hrs running_hrs_new
   SSI     01-01-2016   01      2016    2000        NA         
   SSI     02-01-2016   01      2016    1900       -100            (3/4)
   SSI     03-01-2016   01      2016    2038        138            (3/4)
   SSI     04-01-2016   01      2016    2041        3                3   
   SSII    01-01-2016   01      2016    2000        NA           
   SSII    02-01-2016   01      2016    2100        100            (10/4) 
   SSII    03-01-2016   01      2016    2105        5                5   
   SSII    04-01-2016   01      2016    2110        5                5

值应替换为运行小时数小于 24 且大于或等于零的平均值。我认为我们可以使用条件均值

【问题讨论】:

    标签: r


    【解决方案1】:
    library(dplyr)
    library(tidyr)
    
    new_df <- df%>% 
      group_by(name,year,month) %>% 
      mutate(running_hrs = hours- lag(hours)) %>% 
      mutate(valid_running_hrs= ifelse(running_hrs < 24 & running_hrs > 0,running_hrs,0)) %>%
      replace_na(list(valid_running_hrs=0)) %>%
      group_by(name,year,month) %>%
      mutate(running_hrs_new = ifelse(running_hrs > 24 | running_hrs < 0, mean(valid_running_hrs), running_hrs)) %>%
      as.data.frame()
    

    【讨论】:

      猜你喜欢
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 2018-04-13
      • 2021-02-03
      相关资源
      最近更新 更多