【问题标题】:grouped event chain ID in tidyversetidyverse 中的分组事件链 ID
【发布时间】:2021-02-18 14:09:14
【问题描述】:

我正在尝试为我的数据框创建一个 ID 列,该列对一系列事件进行计数,但不知道哪里出错了。

数据如下:

数据

library(tidyverse)

df <- tribble(
  ~group, ~value,
  "a", 4,
  "a", 3,
  "a", 10,
  "b", 2,
  "b", 4,
  "a", 20,
  "a", 14,
  "a", 12,
  "a", 9,
  "b", 66,
  "b", 23,
  "b", 48)

我尝试过的事情...

我尝试使用cur_group_id(),但这似乎只返回一个识别每个组的二进制值:

df %>%
  group_by(group) %>%
  mutate(ID = cur_group_id()) %>%
  as.data.frame()

# A tibble: 12 x 3
   group value expectedID
   <chr> <dbl>      <dbl>
 1 a         4          1
 2 a         3          1
 3 a        10          1
 4 b         2          1
 5 b         4          1
 6 a        20          2
 7 a        14          2
 8 a        12          2
 9 a         9          2
10 b        66          2
11 b        23          2
12 b        48          2

我也尝试过seq_along(),这让我更接近我想要的,但更多的是对行的运行计数,例如row_number(),每次组有一个值。

df %>%
  group_by(group) %>%
  mutate(ID = seq_along(group)) %>%
  as.data.frame()

   group value expectedID ID
1      a     4          1  1
2      a     3          1  2
3      a    10          1  3
4      b     2          1  1
5      b     4          1  2
6      a    20          2  4
7      a    14          2  5
8      a    12          2  6
9      a     9          2  7
10     b    66          2  3
11     b    23          2  4
12     b    48          2  5

我想要的输出

我真正希望它看起来像这样:

df$expectedID <- c(1,1,1,1,1,2,2,2,2,2,2,2)

# A tibble: 12 x 3
   group value expectedID
   <chr> <dbl>      <dbl>
 1 a         4          1
 2 a         3          1
 3 a        10          1
 4 b         2          1
 5 b         4          1
 6 a        20          2
 7 a        14          2
 8 a        12          2
 9 a         9          2
10 b        66          2
11 b        23          2
12 b        48          2

基本上,如果滞后组与当前组相同,则保留计数。如果滞后组与当前组不同,则开始新计数。每次组更改时,计数增加一。

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    这是一种选择,(ab)使用rle()data.table::rowid()

    df$id <- 
      rle(df$group) %>% {rep(data.table::rowid(.$values), times = .$length)}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多