京公网安备 11010802034615号
经营许可证编号:京B2-20210330
R语言_符串处理和grep的用法
R通常被用来进行数值计算比较多,字符串处理相对较少,而且关于字符串的函数也不多,用得多的就是substr、strsplit、paste、regexpr这几个了。实际上R关于字符串处理的功能是非常强大的,因为它甚至可以直接使用Perl的正则表达式,这也是R的一个理念,作为语言就把向量计算做到极致,作为环境,就在各领域都集成最好的。R中有grep系列的函数,可以用最强大的方式处理字符串的所有问题。
grep的全称是global search regular expression and print out the line,是Unix下一种强大的文本搜索工具,可以通过正则表达式搜索文本,并把匹配的行打印出来,包括grep、egrep和fgrep(egrep是扩展的grep,fgrep是快速的搜寻方式并没有真正利用正则表达式)。Linux下使用GNU版的grep,该套规范也被广泛地使用,R中的grep函数就是其中之一。
grep的核心就是正则表达式(Regular Expressions,通常缩写为regex),所谓正则表达式,就是用某种模式去匹配一类字符串的一个公式,很多文本编辑器或者程序语言都支持该方式进行字符串的操作,最开始是由上文介绍的Unix工具grep之类普及的,后来得到广泛应用。尤其是Perl语言中将正则表达式发挥到了极致。
R中的正则表达式非常专业,从grep系列函数的参数就可以看出,有个参数“extended”,默认为T,表示使用扩展grep,也就是egrep,如果选择为F就表示基础的grep,不过该种方式不被R推荐,即使使用了也会出现警告,实际上grep能做的egrep也都能做,而且还要简单不少。我刚开始在egrep中使用总是不能通过,后来发现其实egrep中更简单,很多时候直接写在[]内就行。还有一个参数“perl”,默认为F,如果选择T表示使用Perl的正则表达式规则,功能更加强大,不过如果没有专门学过Perl语言的话用egrep也就够了。另一个参数“fixed”虽然描述的不是同一个东西,但是也很相关,选择之后就会进行精确的匹配,不再使用正则表达式的规则,在效率上会快很多,我觉得这个可能就是fgrep。R的帮助文档中也明确说明了这三个参数实际上代表了四种模式,常规grep、扩展grep、Perl正则表达式、精确匹配,使用者可以根据具体的含义选择自己需要的,如果参数设置互有冲突,会自动忽略后面的参数,并会在Warning中明确指出。
grep系列函数其实包括grep、grepl、sub、gsub、regexpr、gregexpr,他们的参数很类似,在R中也是把帮助文档集成在了一起,查找任意一个都会得到一个统一的文档。里面对各个参数也是一起介绍的,除了刚才说的三个以外,第一个参数就是最重要的“pattern”,这是一个字符串,直接表示正则表达式,根据模式的不同注意规则就行,另外有个“x”表示要查找的向量,这也是R中的独特之处,不是查找文件,而是查找向量,该处也可以只输入一个字符串,就成了基础的字符串处理函数。对于grep函数,结果只有匹配或者不匹配,因此匹配时输出向量中该元素的下标,如果是单个字符就输出1,对于grepl,和grep其实一样,不过输出的是逻辑值,匹配就是T,不匹配就是F。参数“value”默认为F,输出的值就是刚才说的元素下标或者逻辑值,如果改成T,就会输出查找的字符串。还有一个参数“ignore.case”,默认是F,表示大小写敏感,可以改为T,表示大小写不敏感。参数“useBytes”默认是F,表示按字符查找,如果是T则表示按字节查找,对于中文字符影响还是很大的。参数“invert ”默认为F,表示正常的查找,如果为T则查找模式的补集。像sub和gsub这样的替换函数,还多一个参数“replacement”,用来表示替换的字符。
这些函数的参数都比较类似,但是输出各不一样,grep输出向量的下标,实际上就是找到与没找到,grepl返回的逻辑值更能说明问题。sub是一个很强大的替换函数,远胜过substr,正则表达式中可以设置非常灵活的规则,然后返回被替换后的字符串,如果正则表达式写得好,基本可以解决所有子字符串的问题。sub函数和gsub函数唯一的差别在于前者匹配第一次符合模式的字符串,后者匹配所有符合模式的字符串,也就是说在替换的时候前者只替换第一次符合的,后者替换所有符合的。regexpr和gregexpr被使用的似乎比较多,因为它们很像其他语言中的instr函数,可以查找到某些字符在字符串中出现的位置,不过我觉得用处并不是很大,因为通常情况下寻找某字符位置的目的就是为了做相关处理,而sub都能搞定。regexpr和gregexpr的关系和sub与gsub差不多,gregexpr操作向量时会返回列表。
以上就是grep系列函数的一些用法,根据例子可以很方便地使用,个人建议使用参数“pattern”和“x”就行(sub和gsub当然还有replacement),其他的都用默认的。在pattern中按照egrep的规则写正则表达式,基本上可以解决所有的字符串处理问题。只需要对正则表达式有简单的了解,就可以得到R中这些强大的功能。关于正则表达式的用法就在后文中分解了。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在数字化商业环境中,数据已成为企业优化运营、抢占市场、规避风险的核心资产。但商业数据分析绝非“堆砌数据、生成报表”的简单 ...
2026-01-20定量报告的核心价值是传递数据洞察,但密密麻麻的表格、复杂的计算公式、晦涩的数值罗列,往往让读者望而却步,导致核心信息被淹 ...
2026-01-20在CDA(Certified Data Analyst)数据分析师的工作场景中,“精准分类与回归预测”是高频核心需求——比如预测用户是否流失、判 ...
2026-01-20在建筑工程造价工作中,清单汇总分类是核心环节之一,尤其是针对楼梯、楼梯间这类包含多个分项工程(如混凝土浇筑、钢筋制作、扶 ...
2026-01-19数据清洗是数据分析的“前置必修课”,其核心目标是剔除无效信息、修正错误数据,让原始数据具备准确性、一致性与可用性。在实际 ...
2026-01-19在CDA(Certified Data Analyst)数据分析师的日常工作中,常面临“无标签高维数据难以归类、群体规律模糊”的痛点——比如海量 ...
2026-01-19在数据仓库与数据分析体系中,维度表与事实表是构建结构化数据模型的核心组件,二者如同“骨架”与“血肉”,协同支撑起各类业务 ...
2026-01-16在游戏行业“存量竞争”的当下,玩家留存率直接决定游戏的生命周期与商业价值。一款游戏即便拥有出色的画面与玩法,若无法精准识 ...
2026-01-16为配合CDA考试中心的 2025 版 CDA Level III 认证新大纲落地,CDA 网校正式推出新大纲更新后的第一套官方模拟题。该模拟题严格遵 ...
2026-01-16在数据驱动决策的时代,数据分析已成为企业运营、产品优化、业务增长的核心工具。但实际工作中,很多数据分析项目看似流程完整, ...
2026-01-15在CDA(Certified Data Analyst)数据分析师的日常工作中,“高维数据处理”是高频痛点——比如用户画像包含“浏览次数、停留时 ...
2026-01-15在教育测量与评价领域,百分制考试成绩的分布规律是评估教学效果、优化命题设计的核心依据,而正态分布则是其中最具代表性的分布 ...
2026-01-15在用户从“接触产品”到“完成核心目标”的全链路中,流失是必然存在的——电商用户可能“浏览商品却未下单”,APP新用户可能“ ...
2026-01-14在产品增长的核心指标体系中,次日留存率是当之无愧的“入门级关键指标”——它直接反映用户对产品的首次体验反馈,是判断产品是 ...
2026-01-14在CDA(Certified Data Analyst)数据分析师的业务实操中,“分类预测”是高频核心需求——比如“预测用户是否会购买商品”“判 ...
2026-01-14在数字化时代,用户的每一次操作——无论是电商平台的“浏览-加购-下单”、APP的“登录-点击-留存”,还是金融产品的“注册-实名 ...
2026-01-13在数据驱动决策的时代,“数据质量决定分析价值”已成为行业共识。数据库、日志系统、第三方平台等渠道采集的原始数据,往往存在 ...
2026-01-13在CDA(Certified Data Analyst)数据分析师的核心能力体系中,“通过数据建立模型、实现预测与归因”是进阶关键——比如“预测 ...
2026-01-13在企业数字化转型过程中,业务模型与数据模型是两大核心支撑体系:业务模型承载“业务应该如何运转”的逻辑,数据模型解决“数据 ...
2026-01-12当前手游市场进入存量竞争时代,“拉新难、留存更难”成为行业普遍痛点。对于手游产品而言,用户留存率不仅直接决定产品的生命周 ...
2026-01-12