r - 从 data.table R 中的字符变量中提取数字和字符值
问题描述
我有以下data.table
df <- data.table(id=c(1,2,3,4),
medication=c("Abc de 3 MG", "Afg frt re 4 MG/ML","Agh","Aj yr 5 MG"))
和
id medication
1: 1 Abc de 3 MG
2: 2 Afg frt re 4 MG/ML
3: 3 Agh
4: 4 Aj yr 5 MG
我想从药物中提取剂量,并创建一个名为doses
id medication doses
1: 1 Abc de 3 MG
2: 2 Afg frt re 4 MG/ML
3: 3 Agh <NA>
4: 4 Aj yr 5 MG
它应该包含数字和单位。并非每种药物都有一个编号和单位,应包括在内NA
。
我查看了tidyverse
extract
函数,但找不到要提取的内容numeric
和character
值。我正在使用data.table
大型数据集。省时的功能很棒。
解决方案
在第一个数字之前插入一个@
(或任何其他不在您的列中的字符),然后使用它将列一分为二:
df[, c("medication", "doses") := tstrsplit(sub("([0-9])", "@\\1", medication), "@")]
df
# id medication doses
# 1: 1 Abc de 3 MG
# 2: 2 Afg frt re 4 MG/ML
# 3: 3 Agh <NA>
# 4: 4 Aj yr 5 MG
编辑
一个更干净的解决方案是使用稍微高级的正则表达式(正前瞻),只需要记住perl = TRUE
:
df[, c("medication", "doses") := tstrsplit(medication, ".(?=[0-9])", perl = TRUE)]
推荐阅读
- php - 多个 Wordpress 在一页中循环,产生相同的数据
- unity3d - 是否有将 SVG 导入 Unity android 游戏的免费方法?
- linux - 如何根据文本文件将文件移动到子目录
- jquery - jQuery模糊代码影响整个块
- android - 导航找不到 xml 菜单
- shiny - shinyTree:超过 3 个层级
- node.js - 如何添加数据以自动将数据添加到每个 Express res.render 调用?
- typescript - Array 和 Object 类型的 Typescript 联合
- extjs - 一些按钮后面的奇怪边框[EXTJS 6.5.2]
- azure - Azure 自动化 - 续订 RunAsAccount 证书