R语言中查找字符串第三个下划线位置并写入数据框
解决方案
问题分析
你之前用unlist(gregexpr('_', df$col1))[3]只拿到第一行的结果,是因为gregexpr会返回一个列表,每个元素对应一行字符串的下划线位置;unlist会把所有行的位置合并成一个一维向量,取[3]只是这个向量里的第三个值(也就是第一行的第三个下划线位置),而非每行的第三个。
方法一:Base R 实现
用sapply遍历gregexpr返回的列表,对每行的下划线位置取第三个值:
col1<- c('a_b_c_fv', 'ff_g1_h_fv','e_ii_jjjj_fv' ) df <- data.frame(col1) # 提取每行第三个下划线的位置 df$location <- sapply(gregexpr('_', df$col1), function(x) x[3])
运行后df$location会得到c(6,8,10),完全符合预期。
方法二:stringr 包实现(更直观)
如果习惯用stringr包,可以用str_locate_all获取所有匹配位置,再提取第三个位置的起始值:
library(stringr) df$location <- sapply(str_locate_all(df$col1, '_'), function(x) x[3, 1])
str_locate_all对每个字符串返回一个矩阵,每行对应一个下划线的start和end位置,取第三行的start列就是目标位置。
内容的提问来源于stack exchange,提问作者Log On
相关产品推荐
相关产品推荐

