r - 将重复的字母转换为数字

标签 r string

我有这种类型的数据:

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/

相关文章:

c++ - 从冒号分隔的 .text 文件中提取信息,C++

在 R 中读取多个 CSV 文件作为数据框

r - R 中的 2 倍(重复)积分

r - 如何在 R 中按组顺序标记类别?

Javascript/jQuery 检查字符串是否包含单词或可选单词之一的出现

string - 在 Groovy 中调用 split 之前如何处理单元素数组字符串?

r - 如何使用 R 中的循环分别为每个因子级别生成 z 分数?

r - 在 R 中管理plot.ly 的颜色

android - 如何在 Android RecyclerView 上对字符串进行排序?

string - 从字符串时间到毫秒的快速转换