如何使用mutate函数用索引号替换唯一值?

MeC*_*MeC 1 r dataframe dplyr mutate

我想使用 dplyr::mutate 用索引号替换唯一值。

我按几个不同的变量分组以访问我的数据帧的适当子集。

  head(df)
       group start_time end_time
  1    group1       0   0.4
  2    group1       0   0.4
  3    group1      0   0.4
  4    group1     0.4   0.8
  5    group1     0.4   0.8
  6    group2     0.0   0.4
  7    group2     0.4   0.8
  8    group2     0.8   1.02
Run Code Online (Sandbox Code Playgroud)

我 group_by 'group',然后按 'start_time'。有时一个给定的组只有一个 start_time,有时两个 start_time,有时三个。我需要为每个唯一的 start_time 创建一个新变量“idx”。但我想不出怎么做。

  new_df <- df %>% 
    group_by(group, start_time) %>% 
    mutate(idx = row_number()) %>%
    as.data.frame
Run Code Online (Sandbox Code Playgroud)

使用 row_number() 创建一个新变量是不对的。它给了我:

  idx
  1
  2
  3
  1
  2
  1
  1
  1
Run Code Online (Sandbox Code Playgroud)

但我想要:

  idx
  1
  1
  1
  2
  2
  1
  2
  3
Run Code Online (Sandbox Code Playgroud)

我想用一个数字替换 group_by 中的每个唯一值?并重复?

akr*_*run 5

我们可以match在按“组”分组后使用

library(tidyverse)
df %>% 
   group_by(group) %>%
   mutate(idx = match(start_time, unique(start_time)))
# A tibble: 8 x 4
# Groups:   group [2]
#  group  start_time end_time   idx
#  <chr>       <dbl>    <dbl> <int>
#1 group1        0       0.4      1
#2 group1        0       0.4      1
#3 group1        0       0.4      1
#4 group1        0.4     0.8      2
#5 group1        0.4     0.8      2
#6 group2        0       0.4      1
#7 group2        0.4     0.8      2
#8 group2        0.8     1.02     3
Run Code Online (Sandbox Code Playgroud)

或者另一种选择是 group_indices

df %>% 
   group_split(group) %>%
   map_df(~ .x %>% 
                mutate(idx = group_indices(., start_time)))
Run Code Online (Sandbox Code Playgroud)

注意:如果需要在 'group' 之外创建 'idx',则删除该group_by步骤

注意2:在OP的示例中,两者(有/没有group_by)给出相同的输出