如何在R语言中提取符号间字符串并存储为向量
提取字符串中的术语并转为向量
现有如下R代码定义的字符串:
mystring <- " -Acanthosis nigricans -Hyperpigmentation -Hyperkeratosis -Skin fold regions -Neck -Groin -Axillae -Obesity -Drug-induced AN -Malignant AN"
目标是提取位于\n-和\n之间的术语,最终得到如下向量:
> mystring_extracted [1] "Acanthosis nigricans" "Hyperpigmentation" "Hyperkeratosis" "Skin fold regions" [5] "Neck" "Groin" "Axillae" "Obesity" [9] "Drug-induced AN" "Malignant AN"
之前用gsub("\n-", "", mystring)仅替换了分隔符,导致所有术语连在一起,无法得到独立元素。以下是几种可行的解决方法:
方法一:基础R的strsplit
先清理字符串首尾空白(包括开头空行),再按\n-分割,最后处理每个术语的多余空格:
# 去除首尾空白字符 clean_string <- trimws(mystring) # 按\n-分割字符串,取结果列表的第一个元素 mystring_extracted <- strsplit(clean_string, "\n-")[[1]] # 清理每个术语的首尾空格(比如Obesity后的空格) mystring_extracted <- trimws(mystring_extracted)
方法二:使用stringr包的str_extract_all
利用正则表达式的断言规则,直接匹配所有目标术语:
library(stringr) # 匹配\n-之后、下一个\n或字符串结尾前的内容 mystring_extracted <- str_extract_all(mystring, "(?<=\n-).*?(?=\n|$)")[[1]] # 清理空格 mystring_extracted <- trimws(mystring_extracted)
方法三:基础R的gregexpr+regmatches
通过正则定位匹配位置,再提取对应内容:
# 使用Perl风格正则匹配目标内容 match_positions <- gregexpr("(?<=\n-).*?(?=\n|$)", mystring, perl = TRUE) # 根据位置提取内容 mystring_extracted <- regmatches(mystring, match_positions)[[1]] # 清理空格 mystring_extracted <- trimws(mystring_extracted)
运行任意一种方法后,都能得到预期的向量结果。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

