r - dplyr::cur_group_id() 按出现顺序而不是字母顺序

标签 r indexing dplyr

对于如下所示的数据,我尝试添加一列来记录试订单。数据中,按试验顺序记录 react 时间(rts);这意味着参与者p1按顺序对项目i1i2i3使用react;参与者p2按顺序对项目i2i1i3使用react;然后最后参与者p3按此顺序对i3i1使用react。

library(tidyverse) # For dplyr, tibble, and purrr

data <- tribble(
  ~ p,  ~ r,  ~ i,  ~ rt,
  "p1", "r1", "i1", 1234,
  "p1", "r2", "i1", 1256,
  "p1", "r3", "i1", 1256,
  "p1", "r4", "i1", 1256,
  "p1", "qq", "i1", 1356,
  "p1", "r1", "i2", 1356,
  "p1", "r2", "i2", 1356,
  "p1", "r3", "i2", 1376,
  "p1", "qq", "i2", 1374,
  "p1", "r1", "i3", 1374,
  "p1", "r2", "i3", 1174,
  "p1", "r3", "i3", 1174,
  "p1", "qq", "i3", 1173,
  "p2", "r1", "i2", 1163,
  "p2", "r2", "i2", 1163,
  "p2", "r3", "i2", 1163,
  "p2", "qq", "i2", 1163,
  "p2", "r1", "i1", 1263,
  "p2", "r2", "i1", 1263,
  "p2", "r3", "i1", 1295,
  "p2", "r4", "i1", 1495,
  "p2", "qq", "i1", 1495,
  "p2", "r1", "i3", 1414,
  "p2", "r2", "i3", 1414,
  "p2", "r3", "i3", 1414,
  "p2", "qq", "i3", 1484,
  "p3", "r1", "i3", 1484,
  "p3", "r2", "i3", 1182,
  "p3", "r3", "i3", 1182,
  "p3", "qq", "i3", 1282,
  "p3", "r1", "i1", 1282,
  "p3", "r2", "i1", 1282,
  "p3", "r3", "i1", 1232,
  "p3", "r4", "i1", 1232,
  "p3", "qq", "i1", 1234
)

因此,我想得到一个新的数据,通过在上面的数据中添加一个表示试单的列,如下所示:

| p    |  r   |  i   |  rt  | trial_order |
| "p1" | "r1" | "i1" | 1234 | 1 |
| "p1" | "r2" | "i1" | 1256 | 1 |
| "p1" | "r3" | "i1" | 1256 | 1 |
| "p1" | "r4" | "i1" | 1256 | 1 |
| "p1" | "qq" | "i1" | 1356 | 1 |
| "p1" | "r1" | "i2" | 1356 | 2 |
| "p1" | "r2" | "i2" | 1356 | 2 |
| "p1" | "r3" | "i2" | 1376 | 2 |
| "p1" | "qq" | "i2" | 1374 | 2 |
| "p1" | "r1" | "i3" | 1374 | 3 |
| "p1" | "r2" | "i3" | 1174 | 3 |
| "p1" | "r3" | "i3" | 1174 | 3 |
| "p1" | "qq" | "i3" | 1173 | 3 |
| "p2" | "r1" | "i2" | 1163 | 1 |
| "p2" | "r2" | "i2" | 1163 | 1 |
| "p2" | "r3" | "i2" | 1163 | 1 |
| "p2" | "qq" | "i2" | 1163 | 1 |
| "p2" | "r1" | "i1" | 1263 | 2 |
| "p2" | "r2" | "i1" | 1263 | 2 |
| "p2" | "r3" | "i1" | 1295 | 2 |
| "p2" | "r4" | "i1" | 1495 | 2 |
| "p2" | "qq" | "i1" | 1495 | 2 |
| "p2" | "r1" | "i3" | 1414 | 3 |
| "p2" | "r2" | "i3" | 1414 | 3 |
| "p2" | "r3" | "i3" | 1414 | 3 |
| "p2" | "qq" | "i3" | 1484 | 3 |
| "p3" | "r1" | "i3" | 1484 | 1 |
| "p3" | "r2" | "i3" | 1182 | 1 |
| "p3" | "r3" | "i3" | 1182 | 1 |
| "p3" | "qq" | "i3" | 1282 | 1 |
| "p3" | "r1" | "i1" | 1282 | 2 |
| "p3" | "r2" | "i1" | 1282 | 2 |
| "p3" | "r3" | "i1" | 1232 | 2 |
| "p3" | "r4" | "i1" | 1232 | 2 |
| "p3" | "qq" | "i1" | 1234 | 2 |

我尝试在this之后使用dplyr::cur_group_id()this ,但我最终遇到了一个问题,即 dplyr::cur_group_id() 不尊重向每个参与者呈现项目的顺序。相反,dplyr::cur_group_id() 反射(reflect)了项目的字母顺序。我应该修改什么...?

# A tibble: 35 × 5
# Groups:   i [3]
   p     r     i        rt    ID
   <chr> <chr> <chr> <dbl> <int>
 1 p1    r1    i1     1234     1
 2 p1    r2    i1     1256     1
 3 p1    r3    i1     1256     1
 4 p1    r4    i1     1256     1
 5 p1    qq    i1     1356     1
 6 p1    r1    i2     1356     2
 7 p1    r2    i2     1356     2
 8 p1    r3    i2     1376     2
 9 p1    qq    i2     1374     2
10 p1    r1    i3     1374     3
11 p1    r2    i3     1174     3
12 p1    r3    i3     1174     3
13 p1    qq    i3     1173     3
14 p2    r1    i2     1163     2 # This should be 1
15 p2    r2    i2     1163     2 # This should be 1
16 p2    r3    i2     1163     2 # This should be 1
17 p2    qq    i2     1163     2 # This should be 1
18 p2    r1    i1     1263     1 # This should be 2
19 p2    r2    i1     1263     1 # This should be 2
20 p2    r3    i1     1295     1 # This should be 2
21 p2    r4    i1     1495     1 # This should be 2
22 p2    qq    i1     1495     1 # This should be 2
23 p2    r1    i3     1414     3 # This should be 3
24 p2    r2    i3     1414     3 # This should be 3
25 p2    r3    i3     1414     3 # This should be 3
26 p2    qq    i3     1484     3 # This should be 3
27 p3    r1    i3     1484     2 # This should be 1
28 p3    r2    i3     1182     2 # This should be 1
29 p3    r3    i3     1182     2 # This should be 1
30 p3    qq    i3     1282     2 # This should be 1
31 p3    r1    i1     1282     1 # This should be 2
32 p3    r2    i1     1282     1 # This should be 2
33 p3    r3    i1     1232     1 # This should be 2
34 p3    r4    i1     1232     1 # This should be 2
35 p3    qq    i1     1234     1 # This should be 2

MWE

data |>
  group_split(p) |>
  purrr::map_df(
    ~ .x |>
      group_by(i) |>
      mutate(
        trial_order = cur_group_id(),
      )
  )

最佳答案

您可以使用match() + unique():

library(dplyr)

data %>%
  group_by(p) %>%
  mutate(ID = match(i, unique(i))) %>%
  ungroup()

# A tibble: 35 × 5
   p     r     i        rt    ID
   <chr> <chr> <chr> <dbl> <int>
 1 p1    r1    i1     1234     1
 2 p1    r2    i1     1256     1
 3 p1    r3    i1     1256     1
 4 p1    r4    i1     1256     1
 5 p1    qq    i1     1356     1
 6 p1    r1    i2     1356     2
 7 p1    r2    i2     1356     2
 8 p1    r3    i2     1376     2
 9 p1    qq    i2     1374     2
10 p1    r1    i3     1374     3
11 p1    r2    i3     1174     3
12 p1    r3    i3     1174     3
13 p1    qq    i3     1173     3
14 p2    r1    i2     1163     1
15 p2    r2    i2     1163     1
16 p2    r3    i2     1163     1
17 p2    qq    i2     1163     1
18 p2    r1    i1     1263     2
19 p2    r2    i1     1263     2
20 p2    r3    i1     1295     2
21 p2    r4    i1     1495     2
22 p2    qq    i1     1495     2
23 p2    r1    i3     1414     3
24 p2    r2    i3     1414     3
25 p2    r3    i3     1414     3
26 p2    qq    i3     1484     3
27 p3    r1    i3     1484     1
28 p3    r2    i3     1182     1
29 p3    r3    i3     1182     1
30 p3    qq    i3     1282     1
31 p3    r1    i1     1282     2
32 p3    r2    i1     1282     2
33 p3    r3    i1     1232     2
34 p3    r4    i1     1232     2
35 p3    qq    i1     1234     2

关于r - dplyr::cur_group_id() 按出现顺序而不是字母顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72574649/

相关文章:

r - 使用 Roxygen2 记录 R6 类方法

R 双循环

sql - 重建后索引仍然碎片化(SQL Server)

sql - 如何将索引与数据分开存储在Azure上?

r - group_by() 到 fill() 没有按预期工作

r - 高斯和 Gamma 分布的混合

r - 分组观察数

c - C 中的结构

r - R 中数据帧的智能转置

sql - 根据其他行中列的值选择行