将重复的字母转换为数字

Chr*_*ann 2 string r

我有这种类型的数据:

df <- data.frame(
  Partcpt = c("B","A","B","C"),
  aoi = c("ACA","CB","AA","AABC" )
)
Run Code Online (Sandbox Code Playgroud)

我想用aoi连续的数字替换单个字母,除非字母重复,在这种情况下,应该重复之前的替换数字。有正则表达式解决这个问题吗?我也愿意接受其他解决方案。

期望的输出是这样的:

  Partcpt  aoi
1       B  121
2       A   12
3       B   11
4       C 1123
Run Code Online (Sandbox Code Playgroud)

Tar*_*Jae 6

这是一个 tidyverse 解决方案:

实现这个技巧的行是mutate(ID = match(paste(aoi), unique(paste(aoi))))-> 在 group for id 之后,我们为每个唯一的 aoi 创建唯一的 ID:

library(dplyr)
library(tidyr)

df %>% 
  mutate(id = row_number()) %>% 
  separate_rows(aoi, sep = "(?<!^)(?!$)") %>% #thanks to Chris Ruehlemann
  #separate_rows(aoi, sep= "") %>% #alternative
  #filter(aoi != "") %>%  #alternative
  group_by(id) %>% 
  mutate(ID = match(paste(aoi), unique(paste(aoi)))) %>% 
  mutate(ID = paste0(ID, collapse = "")) %>% 
  slice(1) %>% 
  ungroup() %>% 
  select(Partcpt, aoi=ID)
Run Code Online (Sandbox Code Playgroud)

或者非常感谢@Henrik:

sapply(strsplit(df$aoi, split = ""), \(x) paste(match(x, unique(x)), collapse = ""))
Run Code Online (Sandbox Code Playgroud)
  Partcpt aoi  
  <chr>   <chr>
1 B       121  
2 A       12   
3 B       11   
4 C       1123 
Run Code Online (Sandbox Code Playgroud)