【问题标题】:Sequential Increase in Column value based on a condition R基于条件 R 的列值顺序增加
【发布时间】:2021-05-26 19:43:09
【问题描述】:

我有一个 R 数据框,它有一个 ID 列,其中包含多个 ID 记录。当 ID 的标志设置为 1 时,我想创建一个从 1 开始并以 6(1、6、12...)为增量顺序增加的列新时间线。如何使用 dplyr 在 R 中实现这一点?

下面是一个示例数据框

ID Timepoint Flag
A 0 0
A 6 0
A 12 0
A 18 1
A 24 0
A 30 0
A 36 0

预期的数据框

ID Timepoint Flag New_Timepoint
A 0 0
A 6 0
A 12 0
A 18 1 1
A 24 0 6
A 30 0 12
A 36 0 18

【问题讨论】:

    标签: r dplyr conditional-statements data-transform sequential-number


    【解决方案1】:

    一个选项是按“ID”分组,创建“时间点”的lag,并将n指定为“标志”的位置,其中值为1 (-1)

    library(dplyr)
    df1 %>% 
       group_by(ID) %>% 
       mutate(New_Timepoint = dplyr::lag(replace(Timepoint, !Timepoint, 1),
               n = which(Flag == 1)-1)) %>%
       ungroup
    

    -输出

    # A tibble: 7 x 4
    #  ID    Timepoint  Flag New_Timepoint
    #  <chr>     <int> <int>         <dbl>
    #1 A             0     0            NA
    #2 A             6     0            NA
    #3 A            12     0            NA
    #4 A            18     1             1
    #5 A            24     0             6
    #6 A            30     0            12
    #7 A            36     0            18
    

    或者使用双cumsum来创建索引

    df1 %>% 
       group_by(ID) %>% 
       mutate(New_Timepoint = Timepoint[na_if(cumsum(cumsum(Flag)), 0)]) %>%
       ungroup
    

    数据

    df1 <- structure(list(ID = c("A", "A", "A", "A", "A", "A", "A"), 
        Timepoint = c(0L, 
    6L, 12L, 18L, 24L, 30L, 36L), 
         Flag = c(0L, 0L, 0L, 1L, 0L, 0L, 
    0L)), class = "data.frame", row.names = c(NA, -7L))
    

    【讨论】:

      【解决方案2】:

      另一个dplyr 选项

      df %>%
        group_by(ID) %>%
        mutate(New_Timepoint = pmax(1, Timepoint - c(NA, Timepoint[Flag == 1])[cumsum(Flag) + 1])) %>%
        ungroup()
      

      给予

        ID    Timepoint  Flag New_Timepoint
        <chr>     <int> <int>         <dbl>
      1 A             0     0            NA
      2 A             6     0            NA
      3 A            12     0            NA
      4 A            18     1             1
      5 A            24     0             6
      6 A            30     0            12
      7 A            36     0            18
      

      【讨论】:

        猜你喜欢
        • 2015-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-29
        • 2019-01-16
        相关资源
        最近更新 更多