数据清洗:提取字符串中的数字

在我们日常进行数据清洗的过程中,可能会遇到需要对字符串进行操作和处理的任务。在下面的例子中,我们收到了一份关于医院患者输注血制品的医嘱单,但遗憾的是,在这份数据集中,输注血制品的量包含在了一个字符串中而不是被正确的提取在用量这一列中。数据集如下:

> head(examdata)ID          ORDER_NAME DRUG_QUAN ZXDW
1 2559 输红细胞悬液2个单位         1 <NA>
2 1945 输红细胞悬液2个单位         1 <NA>
3 1846 输红细胞悬液2个单位         1 <NA>
4 2478       输血浆(400ml)         1 <NA>
5 2205 输红细胞悬液2个单位         1 <NA>
6 1571    输血小板10个单位         1 <NA>

stringr包与正则表达式

本次数据处理中,我们将利用stringr包来提取ORDER_NAME中的数字,并将其作为单独的一列,以方便我们后续进行数据的分析。stringr包是R语言中一个简单、易用的字符串操作工具,并且在这个包中,我们可以使用*正则表达式(Regular expressions)*进行字符串的匹配。关于stringr包与正则表达式的相关知识可以参考以下的学习资料:

  • R----stringr包介绍学习:来自CSDN用户介绍的关于stringr包的相关功能及示例,可以快速的了解这个包用法
  • CRAN上的stringr主页:这个页面包含了stringr包相关的资料、下载及所有官方的信息
  • R for Data Science书中字符串的基础教程:这是一本优秀的、免费的电子书,该书的作者Hadley Wickham也是stringr包的作者,在其14章中,介绍了字符串的处理以及正则表达式相关的内容。
  • 中文的正则表达式教程:如果对于英文材料阅读困难,可以从这份优秀的中文教程开始学习正则表达式相关的内容,在这份教程中,还提供了一个在线测试工具,用于验证你的正则表达式是否起作用。

在这个示例中,我们主要用到的函数是str_extract_all(),这函数与str_extract()的区别在于,str_extract_all()可以提取出所有匹配的值,而str_extract()只能提取出匹配的第一个值。在str_extract_all()函数中,我们还可以通过调用simplify = TURE来使得返回结果变为矩阵(如果simplify = FALSE,则返回结果为列表)。

示例及代码

值得注意的是,我们的这个数据集中字符串的数字并不一定是整数,有些红细胞输注可能存在1.5单位之类的,因此在我们的正则表达式中,需要包含小数点:

drugdose <- str_extract_all(examdata$ORDER_NAME, regex("[0-9/.]"), simplify = TRUE)> head(drugdose)[,1] [,2] [,3] [,4]
[1,] "2"  ""   ""   ""
[2,] "2"  ""   ""   ""
[3,] "2"  ""   ""   ""
[4,] "4"  "0"  "0"  ""
[5,] "2"  ""   ""   ""
[6,] "1"  "0"  ""   ""

现在我们已经成功得到了一个提取出数字的矩阵了,但是离我们最后需要的结果还有距离,我们需要将单个的字符给粘贴起来。在这里,我们需要使用plyr包中的ldply()函数以及基础包中的lapply()函数。这里我们将用lapply()函数历遍我们的矩阵,并在每一行都执行一次合并字符串,ldply()则负责将lapply()返回都列表转换为数据框:

pastenum <- function(x, data) {y <- paste0(data[x, ], collapse = "")return(y)
}
library(plyr)
head(ldply(lapply(c(1:nrow(drugdose)), data = drugdose, pastenum)))> head(ldply(lapply(c(1:nrow(drugdose)), data = drugdose, pastenum)))V1
1   2
2   2
3   2
4 400
5   2
6  10

这样,我们就得到了字符串合并的数据框了,剩下的就是将这一列数据粘贴到我们的原始数据就OK了:

> head(cbind(examdata[, -c(3, 4)],
+ ldply(lapply(c(1:nrow(drugdose)), data = drugdose, pastenum))))ID          ORDER_NAME  V1
1 2559 输红细胞悬液2个单位   2
2 1945 输红细胞悬液2个单位   2
3 1846 输红细胞悬液2个单位   2
4 2478       输血浆(400ml) 400
5 2205 输红细胞悬液2个单位   2
6 1571    输血小板10个单位  10

这样,我们就实现了将含在字符串中的数字提取出来,并将其单独放入一列中。

数据清洗:提取字符串中的数字相关推荐

  1. linux 取出字符中数字,使用awk提取字符串中的数字或字母

    1.提取字符串中的数字$ echo 'dsFUs34tg*fs5a%8ar%$#@' |awk -F "" ' { for(i=1;i<=NF;i++) { if ($i ~ ...

  2. awk 内嵌正则 提取字符串_使用awk提取字符串中的数字或字母

    1.提取字符串中的数字 $ echo 'dsFUs34tg*fs5a%8ar%$#@' |awk -F "" ' { for(i=1;i<=NF;i++) { if ($i ...

  3. sql提取字符串中的一部分数据_学会这三招提取字符串中的数字不用愁

    在Excel表格中提取字符串中的数字是我们经常会遇到的问题的,那么平时朋友们都用什么方法呢?今天分享三种方法,学会这三招,提取字符串中的数字不用愁. 一.使用Ctrl+E快速智能填充快捷键: 说明: ...

  4. php提取字符串中数字,php提取字符串中的数字教程

    字符串是我们程序员必定接触法人,有时候工作中需要在一串字符串中将所有的数字提取出来,其实研究一下这种方法还挺多,对如何使用PHP将字符串中的数字提取出来的功能我们做了一个小总结,和大家一起分享一下,总 ...

  5. 用VBA提取字符串中的数字

    上一篇讲了用 python 提取字符串中的数字,这次用VBA来实现.总体思路和 python 是一样的,代码如下: Option ExplicitSub GetNumbers()Dim from_st ...

  6. php 取字符串中的字母数字,php如何提取字符串中的数字?php提取字符串中数字的方法总结(附代码)...

    本篇文章给大家带来的内容是关于php如何提取字符串中的数字?php提取字符串中数字的方法总结(附代码) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. PHP提取字符串中的第一组数字 ...

  7. 如何利用python提取字符串中的数字

    目录 一.isdigit() 函数 二.filter() 函数 三.提取一段字符串中的数字 四.匹配指定字符串开头的数字 参考资料 一.isdigit() 函数 isdigit() 函数是检测输入字符 ...

  8. python小记(五):python如何提取字符串中的数字或其他

    python中"python如何提取字符串中的数字或其他 前言 一.正则表达式 前言 自用 一.正则表达式 import re ^ 匹配字符串的开始. $ 匹配字符串的结尾. \b 匹配一个 ...

  9. 提取字符串中的数字(C语言)

    提取字符串中的数字(C语言) - 康建伟 - 博客园https://www.cnblogs.com/kangjianwei101/p/5220336.html 大佬的分享,在这里方便自己总结学习,因此 ...

最新文章

  1. 纯css实现毛玻璃效果
  2. 百度地图api location 211 sn校验失败
  3. linux函数输入,go编程输入函数
  4. TikTok玩法攻略总结,从输出内容再到变现,结尾送干货!
  5. 怎样在WIN7系统下安装IIS和配置ASP
  6. 【MySQL快速入门】牛客网:条件查询(1)基础排序
  7. Java中的random
  8. 中国互联网二十四年红黑史
  9. POSIX线程优先级设置
  10. 路由器、猫、交换机的解释
  11. 计算机edp测试是什么测试,五、信息工具--(一)EDP:电子数据处理
  12. java入门软件安装教程,PDPS软件-安装入门教程 20200406
  13. 【SemiDrive源码分析】【Yocto源码分析】02 - yocto/meta-openembedded目录源码分析
  14. 移动端多页面APP(MPA)开发体验
  15. 确定sw1开关信号输入端口_三菱PLC入门 | FX2N系列PLC的信号输入端子接线(图文详解)...
  16. python从列表中随机抽取n个元素
  17. Golang源码探索----GC的实现原理(6)
  18. PBX与VoIP:它们之间有什么区别?
  19. Maven的settings.xml配置详解
  20. SEO的心灵窗户:软文技巧

热门文章

  1. PXIe背板 全混合8槽开发设计资料,PXIe背板原理图
  2. OMNI USDT 0.11.0 环境部署
  3. 当机会来临的时候,你做好准备了吗
  4. 基于Java毕业设计校园跑腿平台源码+系统+mysql+lw文档+部署软件
  5. Android 解决BottomSheetDialog 拖曳冲突问题
  6. 使用html5-qrcode 扫描二维码(vue3)
  7. 互联网人,不拼体力拼什么?
  8. MATLAB图像处理之图像增强实战
  9. 赛迪实验室 | “Apache IoTDB V0.13.0”时序数据库通过中国软件评测中心软件产品技术鉴定测试...
  10. 能赢得人不是一开始跑得快,而是坚持下来的人