在R语言中基于另一向量的字符提取字符串中的指定字符
解决方案:提取向量a中对应b字符左侧的相邻字符
嘿,很高兴能帮到你!针对你这个需求,我整理了几种简单易行的方法,你可以根据自己的使用习惯来选择:
方法1:用stringr包定位字符位置(直观易懂)
这个方法先找到b中字符在a里的位置,再提取它左侧的相邻字符,逻辑非常清晰:
# 先加载stringr包(未安装的话先运行 install.packages("stringr")) library(stringr) # 定位每个b字符在对应a元素中的起始位置 char_pos <- str_locate(uedf$a, uedf$b)[, 1] # 提取左侧字符:若位置大于1(说明存在左侧字符)则取前一位,否则返回NA uedf$left_char <- ifelse(char_pos > 1, substr(uedf$a, char_pos - 1, char_pos - 1), NA)
运行后你的uedf会新增一列left_char,结果如下:
| a | b | left_char |
|---|---|---|
| tsm | m | s |
| skr | k | s |
| fl | l | f |
| pfl | l | f |
| ts | s | t |
| St | t | S |
| S | S | NA |
方法2:用base R的正则替换(无需额外包)
如果你不想加载额外的包,用base R自带的sub函数也能搞定,通过正则捕获目标字符:
# 构造正则表达式,捕获b字符前的单个字符并替换为捕获内容 uedf$left_char_base <- sub(paste0(".*(.)", uedf$b, ".*"), "\\1", uedf$a) # 处理b字符在a首位的情况(比如最后一行的"S"),将空值替换为NA uedf$left_char_base[uedf$left_char_base == uedf$a] <- NA
这个方法的结果和方法1完全一致,仅需额外处理特殊情况即可。
方法3:用stringr的正向预查正则(简洁写法)
如果你熟悉正则的正向预查语法,一行代码就能搞定:
uedf$left_char_regex <- str_extract(uedf$a, paste0(".(?=", uedf$b, ")"))
这里的.(?=X)表示匹配X字符前面的任意单个字符,写法简洁,且会自动在无左侧字符时返回NA。
内容的提问来源于stack exchange,提问作者sakwa
相关产品推荐
相关产品推荐

