【问题标题】:Counter starting after two consecutive increase of numbers R数字连续两次增加后开始计数 R
【发布时间】:2020-09-26 14:31:17
【问题描述】:

我有几列,每一列都有事例数,另一列有累计事例数,另一列对应分组变量。我想创建一个额外的列,在案例数量连续两次增加后开始计数。

示例链接:http://www.filedropper.com/teste_6

查看文件,对于医院 A,柜台应从第 60 行开始,累计病例为 5,7 和 10 以及病例 3,2 和 3。对于医院 B,柜台应从第 223 行和医院 C 377 开始。

我不确定如何在连续两次增加后创建计数器。我应该创建一个循环并比较以前的值还是有更简单的方法来实现这一点?

我创建了一个从 1 开始但不是在连续两次增加之后的计数器:

cumulative <- dataset %>%
    group_by(hosp) %>%
    mutate(cum_cases = cumsum(cases)) %>%
    mutate(counter_cases  = cumsum(cummax(cases > 0)))

【问题讨论】:

  • 如何获得 B 组的1,2
  • 嗯,这正是问题所在。如何获得在连续两次增加后开始计数的计数器?虽然 B 会更简单,但 counter_cases 适用于 B,但不适用于更困难的 C。
  • B 组的counter 不应该全为零,因为它只有两个值吗?
  • 仍然,B 组和 C 组之间存在差异,即使它们在每一步都增加。在这种情况下,您希望在开始计数器之前只有 1 个零(如 B 组)还是 2 个零(如 C 组)?
  • 我的意思是计数器从 B 组的第二行开始,在 C 组的第三行开始,即使在组内我们总是有一些增加 cases。跨度>

标签: r dplyr count iteration


【解决方案1】:

示例与您的描述不一致,但是根据您的文字而不是您的示例,这可能是您想要的吗?

library(dplyr)

df %>% 
  group_by(hosp) %>% 
  mutate(counter = sign(cumsum(cases) * cases), 
         counter = counter + lead(counter),
         counter = cumsum(ifelse(is.na(counter), lag(counter), counter) == 2))

【讨论】:

  • 谢谢!就是这样!我在示例中犯了一个错误,我需要更正它。
  • 实际上,这是一种奇怪的行为。该代码适用于某些群体,而不适用于其他群体。我添加了一个指向示例数据集的链接。这些是代码不起作用的某些组的情况。有什么线索吗?
  • @psoares 我明白你的意思。它需要添加cummax 以防止数字连续下降导致计数器停止。我已经更新了。
  • 谢谢!虽然结果并不完全是我所需要的,但只要累积增加,情况是否减少并不重要。如果有 2 例,然后 1 例,它仍然是增加的。例如,对于医院 A,计数器应从第 60 行开始,累积病例数为 5,7 和 10,病例数为 3,2 和 3。对于医院 B,计数器应从第 223 行和医院 C 377 开始。我一直在玩使用您的代码,但我仍然没有所需的输出。适用于一些但不是全部。感谢您的帮助!
  • @psoares 我已经更新了我的代码,它似乎给出了你指定的输出。
【解决方案2】:

我们可以使用data.table

library(data.table)
setDT(df)[, counter := cumsum(cumsum(sign(c(0, diff(cases)))) > 1), hosp]

【讨论】:

  • 谢谢!但是代码并不完全符合我的需要。我已经编辑了问题并添加了一个包含一些组的文件,以查看计数器应该从哪里开始。
  • @psoares 请把它链接到github上,因为外部链接有点吓人
猜你喜欢
  • 2016-06-02
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多