如何在字母转数字后的字符串中还原插入原位置的特殊字符*
保留非事件位置的字母转连续数字处理
我有一个包含Partcpt和aoi列的数据框,其中aoi列包含事件(大写字母)和非事件(用"*"表示):
df <- data.frame( Partcpt = c("B","A","B","C","A","B"), aoi = c("B*B*B","*A*C*A*C","*B*B","A*C","*A*","*") )
需要将其中的字母转换为连续数字,重复字母沿用之前的对应数字。之前用以下代码实现了转换,但丢失了非事件"*"的位置信息:
df$aoi_0 <- sapply(strsplit(df$aoi, split = ""), function(x) paste(match(x[x!="*"], unique(x[x!="*"])), collapse = "")) df Partcpt aoi aoi_0 1 B B*B*B 111 2 A *A*C*A*C 1212 3 B *B*B 11 4 C A*C 12 5 A *A* 1 6 B *
需要将"*"字符重新插入到原位置,得到如下结果:
df Partcpt aoi aoi_0 1 B B*B*B 1*1*1 2 A *A*C*A*C *1*2*1*2 3 B *B*B *1*1 4 C A*C 1*2 5 A *A* *1* 6 B * *
解决方案
修改strsplit后的处理逻辑,不对元素进行过滤,而是逐个判断处理:保留"*",将字母替换为对应的连续数字:
df$aoi_0 <- sapply(strsplit(df$aoi, split = ""), function(x) { # 获取当前字符串中所有非*的唯一字符 unique_chars <- unique(x[x != "*"]) # 逐个处理每个字符:*直接保留,字母替换为对应的数字 mapped_elements <- ifelse(x == "*", "*", match(x, unique_chars)) # 将处理后的元素拼接成字符串 paste(mapped_elements, collapse = "") }) # 查看最终结果 print(df)
运行上述代码后,就能得到包含"*"位置信息的目标输出。
内容的提问来源于stack exchange,提问作者Chris Ruehlemann
相关产品推荐
相关产品推荐

