【问题标题】:R cumulative sum using dplyr with reset使用带有重置的 dplyr 的 R 累积和
【发布时间】:2019-07-29 18:23:06
【问题描述】:

我正在尝试制作一个表格,计算按“state”和“p”列分组的连续年数,如下所示:

    data_right <- data.table(state = c("NY", "NY", "NY", "NY", "NY","NY", "PA", 
    "PA", "PA", "PA", "PA", "PA"), p = c("n", "n","n","n", "p", "p", "n", "n", "n", 
    "p", "p", "p"),Year = c("1973", "1974", "1977", "1978", "1988", "1989" ,"1991", 
    "1992", "1993", "1920", "1929", "1931"), Consecutive_Yrs = 
    c(1,2,1,2,1,2,1,2,3,1,1,1))

我现在使用的代码不能正常工作。我正在尝试 dplyr 中的 mutate 和 group_by 语句,但没有运气。我也不能使用 data.table 包,因为我的 R version 不是最新的。

非常感谢任何获得此输出的帮助!

【问题讨论】:

  • “无法正常工作”:这将极大地帮助您展示您尝试过的内容以及为什么它无法正常工作。更贴近您当前编码风格(或纠正其中的不良做法)的答案最终会帮助您做得更好。

标签: r dplyr cumsum


【解决方案1】:
library(dplyr)
data_right %>%
  group_by(state, p) %>%
  mutate(grp = cumsum(c(TRUE, diff(as.integer(Year)) > 1))) %>%
  group_by(state, p, grp) %>%
  mutate(cy = row_number()) %>%
  ungroup() %>%
  select(-grp)
# # A tibble: 12 x 5
#    state p     Year  Consecutive_Yrs    cy
#    <chr> <chr> <chr>           <dbl> <int>
#  1 NY    n     1973                1     1
#  2 NY    n     1974                2     2
#  3 NY    n     1977                1     1
#  4 NY    n     1978                2     2
#  5 NY    p     1988                1     1
#  6 NY    p     1989                2     2
#  7 PA    n     1991                1     1
#  8 PA    n     1992                2     2
#  9 PA    n     1993                3     3
# 10 PA    p     1920                1     1
# 11 PA    p     1929                1     1
# 12 PA    p     1931                1     1

假设数据已经按Year排序。


数据:

data_right <- data.table(state = c("NY", "NY", "NY", "NY", "NY","NY", "PA", "PA", "PA", "PA", "PA", "PA"), p = c("n", "n","n","n", "p", "p", "n", "n", "n", "p", "p", "p"),Year = c("1973", "1974", "1977", "1978", "1988", "1989" ,"1991", "1992", "1993", "1920", "1929", "1931"), Consecutive_Yrs = c(1,2,1,2,1,2,1,2,3,1,1,1))

【讨论】:

  • 这不适用于数据结构如下的情况: data_right
  • 您的代码输出如下: data_wrong
  • 也许这是一个更好的样本,然后,包含在您的问题中。
  • 好的,我在我的问题中更改了它。抱歉,我没有考虑过这样的情况。
猜你喜欢
  • 1970-01-01
  • 2018-08-09
  • 2020-11-18
  • 2019-03-28
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多