R语言使用mutate提取正则全匹配并拼接的简化方案求教
实现方案
str_extract_all返回的是列表类型的结果,每一个元素是对应行的所有匹配结果向量。你之前直接用paste拼接的问题在于,paste默认会把整个列表作为输入处理,而非按行逐个处理列表内的向量,所以会出现所有行的结果都混在一起的异常输出。
直接用purrr::map_chr对每一行的匹配结果单独执行拼接即可,代码非常简洁,不需要嵌套unnest_wider和unite操作:
library(tidyverse) # 示例数据 df <- tibble( phrase = c( "I like apples. I love apple pies. An apple a day...", "I hate apples. Specially apple pies" ) ) # 核心实现 df <- df %>% mutate( output = str_extract_all(phrase, '\\b[[:alpha:]]+\\b(?=\\sapple)') %>% map_chr(~ paste(.x, collapse = "; ")) )
运行后得到的结果和预期完全一致:
# A tibble: 2 × 2 phrase output <chr> <chr> 1 I like apples. I love apple pies. An apple a day... like; love; An 2 I hate apples. Specially apple pies hate; Specially
如果习惯用base R语法,也可以用sapply替代map_chr:
df$output <- sapply( str_extract_all(df$phrase, '\\b[[:alpha:]]+\\b(?=\\sapple)'), function(x) paste(x, collapse = "; ") )
内容的提问来源于stack exchange,提问作者GuedesBF
相关产品推荐
相关产品推荐

