根据 R 中的匹配条件在新列中创建唯一行值

Create unique row values in new column based on matching criteria in R

我有一个数据框,其中包含一个唯一值标识符列和一个包含特定条件的列。

我想创建一个新的唯一值标识符列,但该值还包含有关它满足哪些条件的信息。在下面的示例中,我使用 case_when()seq_along() 来完成此操作:

set.seed(1)
df <- data.frame(
    ID = LETTERS[1:10],
    Criteria = paste0("Crit ", floor(runif(10, min=1, max=4)))
)
df %>%
mutate(
    ID2 = case_when(
        Criteria == "Crit 1" ~ paste0("x", seq_along(Criteria)),
        Criteria == "Crit 2" ~ paste0("y", seq_along(Criteria)),
        Criteria == "Crit 3" ~ paste0("z", seq_along(Criteria))
    )
)

输出:

A data.frame: 10 × 3
ID  Criteria ID2
A   c1       x1
B   c2       y2
C   c2       y3
D   c3       z4
E   c1       x5
F   c3       z6
G   c3       z7
H   c2       y8
I   c2       y9
J   c1       x10

新列 ID2 现在具有唯一的行值(数字 1 到 10)并且可以在其中标识条件(字母 x、y 和 z)。但是,seq_along() 为每一行插入一个新数字,而不考虑标准。我宁愿每个标准的计数从 1 重新开始。 (例如,对于标准 c1x1x2x3、...、xn;对于 c2y1, y2, y3, ..., ym; 等等)

我想要的:

A data.frame: 10 × 3
ID  Criteria ID2
A   c1       x1
B   c2       y1
C   c2       y2
D   c3       z1
E   c1       x2
F   c3       z2
G   c3       z3
H   c2       y3
I   c2       y4
J   c1       x3

您只需添加 group_by(Criteria):

library(dplyr)

df %>%
  group_by(Criteria) %>%
  mutate(
    ID2 = case_when(
      Criteria == "Crit 1" ~ paste0("x", seq_along(Criteria)),
      Criteria == "Crit 2" ~ paste0("y", seq_along(Criteria)),
      Criteria == "Crit 3" ~ paste0("z", seq_along(Criteria))
    )
  )

输出:

# A tibble: 10 × 3
# Groups:   Criteria [3]
   ID    Criteria ID2  
   <chr> <chr>    <chr>
 1 A     Crit 1   x1   
 2 B     Crit 2   y1   
 3 C     Crit 2   y2   
 4 D     Crit 3   z1   
 5 E     Crit 1   x2   
 6 F     Crit 3   z2   
 7 G     Crit 3   z3   
 8 H     Crit 2   y3   
 9 I     Crit 2   y4   
10 J     Crit 1   x3