tidyverse 的另一种可能性可能是:
dat %>%
group_by(id, name) %>%
mutate(unique_name = if(n() > 1) paste(name, letters[1:length(name)], sep = "_") else name)
id name unique_name
<chr> <chr> <chr>
1 172262 Fam Fam_a
2 172262 Fam Fam_b
3 172262 Fam Fam_c
4 172262 CM_fam CM_fam
5 172504 CBT_Fam CBT_Fam_a
6 172504 CBT_Fam CBT_Fam_b
7 172504 CBT_Fam CBT_Fam_c
8 172507 TAU TAU
9 172507 CBT_Educ CBT_Educ
10 172507 CBT_MI CBT_MI
首先,它按“id”和“name”分组。然后,如果每组的病例数大于1,则将“name”中的值与“name”长度的字母序列组合,否则将“name”中的值赋值。
或者用length()代替n():
dat %>%
group_by(id, name) %>%
mutate(unique_name = if(length(name) > 1) paste(name, letters[1:length(name)], sep = "_") else name)
或者用seq_along()代替n():
dat %>%
group_by(id, name) %>%
mutate(unique_name = if(any(seq_along(name) != 1)) paste(name, letters[1:length(name)], sep = "_") else name)
或者使用gl() 生成字母的稍微不同的方法:
dat %>%
group_by(id, name) %>%
mutate(unique_name = if(n() > 1) paste(name, gl(length(name), 1, n(), letters), sep = "_") else name)
id name unique_name
<chr> <chr> <chr>
1 172262 Fam Fam_a
2 172262 Fam Fam_b
3 172262 Fam Fam_c
4 172262 CM_fam CM_fam
5 172504 CBT_Fam CBT_Fam_a
6 172504 CBT_Fam CBT_Fam_b
7 172504 CBT_Fam CBT_Fam_c
8 172507 TAU TAU
9 172507 CBT_Educ CBT_Educ
10 172507 CBT_MI CBT_MI
或者:
dat %>%
group_by(id, name) %>%
mutate(unique_name = if(length(name) > 1) paste(name, gl(length(name), 1, n(), letters), sep = "_") else name)
或者:
dat %>%
group_by(id, name) %>%
mutate(unique_name = if(any(seq_along(name) != 1)) paste(name, gl(length(name), 1, n(), letters), sep = "_") else name)