我有这种类型的数据:
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)
这是一个 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)
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |