【问题标题】:Add column counting repetitions of a sequence添加序列的列计数重复
【发布时间】:2019-02-06 15:02:52
【问题描述】:

我正在尝试向数据框中添加一列,用于计算序列已运行的次数——在本例中,最多为 12 个月。

我从月份和年份开始,但为了进行分析,我需要使用调整后的 month_lag 列。

year.reprex <- rep(1982:2015, each=12)
month.reprex <- rep(1:12, times=34)
df <- cbind(year.reprex, month.reprex) %>% 
  as_tibble() %>% 
  mutate(
    month_lag = ifelse(month.reprex < 12, month.reprex+1, 1))

我想添加一个带有数字计数器的列,用于计算month_lag 运行到12 的次数。month_lag 的第一个值是2,所以我不能只计算1:12 的序列数。此计数器将从实际年份列偏移一个月。在这个表达式中,对于前 11 行(month_lag 从 2 到 12),我希望 year_counter 为 1。当第 12 行中的 month_lag 重置为 1 时,year_counter 应该增加到 2,并在每次 month_lag 运行时继续增加最多 12 并从 1 重新开始。如果可能的话,dplyr 解决方案会很棒。

【问题讨论】:

  • 是的!我实际上在您的代码中需要month_lag==1,所以year_lagmonth_lag 命中1 而不是12 时会上升——但这解决了它。谢谢!

标签: r dplyr tidyverse


【解决方案1】:

我们可以在month_lag 为 1 时增加一个计数器,这可以使用cumsum 来实现

library(dplyr)

df %>% mutate(year_lag = cumsum(month_lag == 1) + 1)

# year.reprex month.reprex month_lag   year_lag
#         <int>        <int>     <dbl>    <dbl>
# 1        1982            1         2        1
# 2        1982            2         3        1
# 3        1982            3         4        1
# 4        1982            4         5        1
# 5        1982            5         6        1
# 6        1982            6         7        1
# 7        1982            7         8        1
#....

或者在基础R中

df$year_lag <- cumsum(df$month_lag == 1) + 1

【讨论】:

    猜你喜欢
    • 2015-03-09
    • 2019-01-23
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多