【问题标题】:Aggregation of text elements per id over the last 10 or 30 days in RR 中过去 30 天每个 id 文本元素的聚合
【发布时间】:2022-12-07 05:19:17
【问题描述】:

我有一个如下所示的数据集:

id <-c(1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2)
date <- c("2022-11-01 22:22:01","2022-11-01 22:22:01","2022-11-18 12:48:16","2022-11-19 20:57:44","2022-11-19 20:57:44","2022-11-28 13:33:28","2022-11-29 19:24:28",
         "2022-11-29 19:24:28","2022-11-01 10:02:47","2022-11-01 10:02:47","2022-11-08 02:48:37","2022-11-08 02:48:37","2022-11-17 17:35:17","2022-11-17 17:35:17",
         "2022-11-22 12:30:20","2022-11-22 12:30:20","2022-11-30 09:47:45")
type <- c("aaa", "aaa", "bbb", "ccc", "aaa", "ccc", "aaa", "bbb", "bbb", "aaa", "bbb", "ccc", "bbb", "aaa", "ccc", "bbb", "ddd")
o_number <- c(NA, NA, NA, NA, 11, NA, NA, 12, NA, NA, NA, NA, NA, 13, NA, NA, 14)
total <- c(0, 0, 0, 0, 100, 0, 0, 200, 0, 0, 0, 0, 0, 300, 0, 0, 400)
df <- data.table(id,date,type, o_number, total)

我想在所有有“to_number”的地方通过“id”列总结过去 30 天“type”列的所有文本元素。

结果应如下所示:

    id                date type o_number total                        type_over_last_30days_per_id
 1:  1 2022-11-01 22:22:01  aaa       NA     0                                                    
 2:  1 2022-11-01 22:22:01  aaa       NA     0                                                    
 3:  1 2022-11-18 12:48:16  bbb       NA     0                                                    
 4:  1 2022-11-19 20:57:44  ccc       NA     0                                                    
 5:  1 2022-11-19 20:57:44  aaa       11   100                         aaa > aaa > bbb > ccc > aaa
 6:  1 2022-11-28 13:33:28  ccc       NA     0                                                    
 7:  1 2022-11-29 19:24:28  aaa       NA     0                                                    
 8:  1 2022-11-29 19:24:28  bbb       12   200       aaa > aaa > bbb > ccc > aaa > ccc > aaa > bbb
 9:  2 2022-11-01 10:02:47  bbb       NA     0                                                    
10:  2 2022-11-01 10:02:47  aaa       NA     0                                                    
11:  2 2022-11-08 02:48:37  bbb       NA     0                                                    
12:  2 2022-11-08 02:48:37  ccc       NA     0                                                    
13:  2 2022-11-17 17:35:17  bbb       NA     0                                                    
14:  2 2022-11-17 17:35:17  aaa       13   300                   bbb > aaa > bbb > ccc > bbb > aaa
15:  2 2022-11-22 12:30:20  ccc       NA     0                                                    
16:  2 2022-11-22 12:30:20  bbb       NA     0                                                    
17:  2 2022-11-30 09:47:45  ddd       14   400 bbb > aaa > bbb > ccc > bbb > aaa > ccc > bbb > ddd

我尝试了以下代码的很多变体:

 df %>%
       filter(date >= (date - days(30)) &  (date - days(30)) <= date)  %>% 
       dplyr::group_by(id, o_number)  %>%
       dplyr::summarise(type_over_last_30days_per_id = paste(type, collapse = ">"))

你能帮我么?

【问题讨论】:

    标签: r aggregate


    【解决方案1】:

    我确信有更好的方法可以做到这一点,但我试了一下。

    # Get row id per group
    df[, grp_id := rowid(id)]
    
    # This returns all values of type per group when o_number 1= NA
    df[, last_30 := ifelse(!is.na(o_number), vapply(.SD, paste0, collapse = ">", FUN.VALUE = character(1L)), NA), by = .(id), .SDcols = c("type")][]
    
    # Apply by rows over grp_id and last_30 then subset the initial character string in last_30 by the grp id value.
    df[last_30 != "NA", 
       type_over_last_30days_per_id := apply(.SD, 1, function(x) {
         # x is a named vector here
          paste0(unlist(strsplit(x["last_30"], ">"))[1:as.integer(x["grp_id"])], collapse = " > ")
      }), 
      by = .I, 
      .SDcols = c("last_30", "grp_id")][, `:=` (grp_id = NULL, last_30 = NULL)]
    
    > df
        id                date type o_number total                        type_over_last_30days_per_id
     1:  1 2022-11-01 22:22:01  aaa       NA     0                                                <NA>
     2:  1 2022-11-01 22:22:01  aaa       NA     0                                                <NA>
     3:  1 2022-11-18 12:48:16  bbb       NA     0                                                <NA>
     4:  1 2022-11-19 20:57:44  ccc       NA     0                                                <NA>
     5:  1 2022-11-19 20:57:44  aaa       11   100                         aaa > aaa > bbb > ccc > aaa
     6:  1 2022-11-28 13:33:28  ccc       NA     0                                                <NA>
     7:  1 2022-11-29 19:24:28  aaa       NA     0                                                <NA>
     8:  1 2022-11-29 19:24:28  bbb       12   200       aaa > aaa > bbb > ccc > aaa > ccc > aaa > bbb
     9:  2 2022-11-01 10:02:47  bbb       NA     0                                                <NA>
    10:  2 2022-11-01 10:02:47  aaa       NA     0                                                <NA>
    11:  2 2022-11-08 02:48:37  bbb       NA     0                                                <NA>
    12:  2 2022-11-08 02:48:37  ccc       NA     0                                                <NA>
    13:  2 2022-11-17 17:35:17  bbb       NA     0                                                <NA>
    14:  2 2022-11-17 17:35:17  aaa       13   300                   bbb > aaa > bbb > ccc > bbb > aaa
    15:  2 2022-11-22 12:30:20  ccc       NA     0                                                <NA>
    16:  2 2022-11-22 12:30:20  bbb       NA     0                                                <NA>
    17:  2 2022-11-30 09:47:45  ddd       14   400 bbb > aaa > bbb > ccc > bbb > aaa > ccc > bbb > ddd
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      • 2020-06-29
      • 2022-01-18
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 2013-07-27
      相关资源
      最近更新 更多