【问题标题】:R cumulative sum by variable with re-setR 变量的累积总和与重置
【发布时间】:2019-12-19 14:02:53
【问题描述】:

我是一名兼职 R 用户,我正在寻找有关以下查询的一些建议:

我正在尝试创建一个 SPC 图表,该图表将根据高于/低于平均值的一些数据点来提高和/或降低。我知道那里有经过尝试和测试的 R 包,例如 qcc 可以很容易地生成一个漂亮的 SPC 图,但不幸的是,它似乎没有达到我们想要的效果,即显示基于控制限制的升级或降级低于或高于 8 分。 (至少从我所见)。

我在手动创建平均值和控制限制后的最初想法是创建一个变量,当数据低于或超过限制时,该变量将分配一个 TRUE 或 FALSE 值,然后创建 TRUE / FALSE 值的运行计数,使用 runner 包,然后是另一个变量,当 >= 9 时将重置运行计数。我发现当运行计数达到 9 时计数重置为 1,但在变量再次更改之前不会按预期重新计算在真/假之间。请以下面的代码和数据输出为例:

 make count of n above and below the mean

    dat4 = dat4 %>% 
       group_by(`Dept`) %>% 
       mutate(Count = case_when(n > Mean ~ TRUE, 
                                n < Mean ~ FALSE))

create a running count of the number of times n moves above / below the mean

        dat4 = dat4 %>%
      group_by(`Dept`) %>%
      mutate(run = streak_run(Count))

 reset the run when it reaches 8 then start over again for each Dept

dat4 = dat4 %>%
  group_by(`Dept`, run) %>%
  mutate(runreset = case_when(run >= 9 ~ streak_run(run),
                              run < 9 ~ run))

请注意,数据以数据框格式存储(以下格式只是为了让大家更容易阅读作为示例):

Count <- c(F, T, T, T, T, T, T, T, T, T, T, T, F, F, T)
run <- c(1,1,2,3,4,5,6,7,8,9,10,11,1,2,1)
runreset <- c(1,1,2,3,4,5,6,7,**8,1,1,1**,1,2,1)

我希望看到的是当它超过 8 时开始重复计数:

runreset <- c(1,1,2,3,4,5,6,7,**8,1,2,3**,1,2,1)

任何关于我如何尝试解决此问题的想法将不胜感激,当然,此后的下一步是根据每个部门的 runreset 何时通过 8 重新计算控制限制。

【问题讨论】:

    标签: r variables dplyr statistics


    【解决方案1】:

    可能有多种方法可以实现这一点,一种方法是在run &gt; 8 时使用%% 获取余数,以便计数在run &gt; 8 之后自动初始化。

    transform(df, runans = ifelse(run > 8, run %% 8, run))
    
    #   Count run runreset runans
    #1  FALSE   1        1      1
    #2   TRUE   1        1      1
    #3   TRUE   2        2      2
    #4   TRUE   3        3      3
    #5   TRUE   4        4      4
    #6   TRUE   5        5      5
    #7   TRUE   6        6      6
    #8   TRUE   7        7      7
    #9   TRUE   8        8      8
    #10  TRUE   9        1      1
    #11  TRUE  10        1      2
    #12  TRUE  11        1      3
    #13 FALSE   1        1      1
    #14 FALSE   2        2      2
    #15  TRUE   1        1      1
    

    如果你想按组应用这个

    library(dplyr)
    df %>% group_by(Dept) %>% mutate(runans = ifelse(run > 8, run %% 8, run))
    

    数据

    Count <- c(F, T, T, T, T, T, T, T, T, T, T, T, F, F, T)
    run <- c(1,1,2,3,4,5,6,7,8,9,10,11,1,2,1)
    runreset <- c(1,1,2,3,4,5,6,7,8,1,1,1,1,2,1)
    df <- data.frame(Count, run, runreset)
    

    【讨论】:

    • 非常感谢 Ronak 我不知道那个 %% 符号或其用途:),非常有用。仅供参考,我必须对代码进行轻微调整,因为在第一次重置 8 后,如果例如连续出现 16 个或更多(真/假)run %% 9,它将在 7 处重置
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 2020-11-28
    相关资源
    最近更新 更多