我有这种类型的数据:
df <- data.frame(
Partcpt = c("B","A","B","C"),
aoi = c("ACA","CB","AA","AABC" )
)
我想用连续的数字替换 aoi
中的单个字母,除非字母重复,在这种情况下,应该重复较早的替换数字。有正则表达式解决方案吗?我也对其他解决方案持开放态度。
期望的输出是这样的:
Partcpt aoi
1 B 121
2 A 12
3 B 11
4 C 1123
最佳答案
这是一个 tidyverse 解决方案:
有用的行是 mutate(ID = match(paste(aoi), unique(paste(aoi))))
-> 在 group for id 之后,我们为每个唯一的创建唯一的 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)
或者非常感谢@Henrik:
sapply(strsplit(df$aoi, split = ""), \(x) paste(match(x, unique(x)), collapse = ""))
Partcpt aoi
<chr> <chr>
1 B 121
2 A 12
3 B 11
4 C 1123
关于r - 将重复的字母转换为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73011685/