【问题标题】:Create new index based on conditional increment根据条件增量创建新索引
【发布时间】:2021-05-21 18:11:27
【问题描述】:

我有一个看起来像这样的数据框(但有 1000 行):

Person_ID Visit_ID Time_Diff
1 1 NA
2 2 NA
3 3 NA
3 4 1444
4 5 NA
4 6 0
4 7 0
4 8 180
5 9 NA
6 10 NA
7 11 NA
7 12 19
8 13 NA
8 14 25
9 15 NA

你从中看到的是:

  1. 同一个 person_ID 可以在多行中
  2. Visit_ID 始终以 1 递增
  3. Time Diff 有时为 NA,有时为负,有时为正

我想做的是:

  1. 创建一个新的 Visit_ID(我们称之为 New_Visit_ID)
  2. 从第一行的 1 开始该 ID,然后每行递增 Person_ID 更改或 Time_Diff 大于 24(即不是 NA 或

这意味着具有

希望这很清楚!

期望的输出应该是:

Person_ID Visit_ID Time_Diff New_Visit_ID
1 1 NA 1
2 2 NA 2
3 3 NA 3
3 4 1444 4
4 5 NA 5
4 6 0 5
4 7 0 5
4 8 180 6
5 9 NA 7
6 10 NA 8
7 11 NA 9
7 12 19 9
8 13 NA 10
8 14 25 11
9 15 NA 12

【问题讨论】:

    标签: r dplyr datatable


    【解决方案1】:

    我们根据两个条件创建两列'ind1','ind2' 1)检查'Time_Diff'大于24。2)检查'Person_ID'的相邻元素是否相同,然后将它们相加,得到累积总和 (cumsum) 以创建“New_Visit_ID”

    library(dplyr)
    df1 %>%
       mutate(ind1 = (Time_Diff > 24 & !is.na(Time_Diff)),
       ind2 = Person_ID != lag(Person_ID, default = first(Person_ID)),
       New_Visit_ID= cumsum(ind1 + ind2) + 1, ind1 = NULL, ind2 = NULL)
    

    -输出

    #    Person_ID Visit_ID Time_Diff New_Visit_ID
    #1          1        1        NA            1
    #2          2        2        NA            2
    #3          3        3        NA            3
    #4          3        4      1444            4
    #5          4        5        NA            5
    #6          4        6         0            5
    #7          4        7         0            5
    #8          4        8       180            6
    #9          5        9        NA            7
    #10         6       10        NA            8
    #11         7       11        NA            9
    #12         7       12        19            9
    #13         8       13        NA           10
    #14         8       14        25           11
    #15         9       15        NA           12
    

    数据

    df1 <- structure(list(Person_ID = c(1L, 2L, 3L, 3L, 4L, 4L, 4L, 4L, 
    5L, 6L, 7L, 7L, 8L, 8L, 9L), Visit_ID = 1:15, Time_Diff = c(NA, 
    NA, NA, 1444L, NA, 0L, 0L, 180L, NA, NA, NA, 19L, NA, 25L, NA
    )), class = "data.frame", row.names = c(NA, -15L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-02
      • 2016-12-10
      • 1970-01-01
      • 2023-02-23
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      相关资源
      最近更新 更多