r - 使用R从长字符串中提取部分单词到字段中
问题描述
我有一个带有 3 个 obs 的长字符串变量。我试图创建一个字段 prob 以从长字符串中提取特定字符串。代码和消息如下。
data aa:“成为携带者的概率为 0.0002422359”“BRCA1 携带者 0.0001061067”“BRCA2 携带者 0.00013612”
在此处输入代码 aa$prob <- ifelse(grepl("成为携带者的概率是", xx)==TRUE, word(aa, 8, 8), ifelse(grepl("BRCA", xx)==TRUE , 单词(aa, 5, 5), NA))
警告消息:在 aa$prob <- ifelse(grepl("成为携带者的概率是", : 将 LHS 强制到列表中
解决方案
这是我以前的答案,更新以反映data.frame
.
library(dplyr)
aa <- data.frame(aa = c("...", "...", "The probability of being a carrier is 0.0002422359 ", " an BRCA1 carrier 0.0001061067 ", " an BRCA2 carrier 0.00013612 ", "..."))
aa %>%
mutate(prob = as.numeric(if_else(grepl("(probability|BRCA[12] carrier)", aa),
gsub("^.*?\\b([0-9]+\\.?[0-9]*)\\s*$", "\\1", aa), NA_character_)))
# aa prob
# 1 ... NA
# 2 ... NA
# 3 The probability of being a carrier is 0.0002422359 0.0002422359
# 4 an BRCA1 carrier 0.0001061067 0.0001061067
# 5 an BRCA2 carrier 0.00013612 0.0001361200
# 6 ... NA
正则表达式演练:
^
并且$
分别是字符串的开头和结尾;\\b
是词边界;这些都不“消耗”任何字符,它们只是标记开始和结束.
表示一个字符?
表示“零或一”,又名可选;*
指“零个或多个”;+
指“一个或多个”;都指前一个字符/类/组\\s
是空格,包括空格和制表符[0-9]
是一个类,表示 0 到 9 之间的任何字符;同样,[a-z]
都是小写字母、[a-zA-Z]
都是字母、[0-9A-F]
都是十六进制数字等(...)
是一个已保存的组;|
在组中用作“或”的情况并不少见;该组稍后在编号组的replacement=
部分中使用,因此从模式中回忆第一组gsub
\\1
如此分组和总结:
"^.*?\\b([0-9]+\\.?[0-9]*)\\s*$"
1 ^^^^^^^^^^^^^^^^^^
2 ^^^
3 ^^^
4 ^^^^
- 这是“数字”部分,它允许一个或多个数字、一个可选的小数点以及零个或多个数字。这保存在组“1”中。
- 单词边界保证我们包含前导数字(根据一些事情,有
"12.345"
可能被解析为"2.345"
没有这个。 - 类似数字的字符串之前的任何内容。
- 数字后有一些空格或没有空格。
以有组织的方式逻辑分组
正则表达式不是 R 独有的,它是 R(和大多数其他编程语言)以某种方式支持的解析语言。
推荐阅读
- android - 不同Android版本的Webview实现差异
- dolphindb - 如何清除集群的缓存?
- javascript - 如何使用 componentWillReceiveProps 模仿 useEffect?
- node.js - 嗨,是否可以使用 Node.js 在 Dialogflow 中创建实体?
- lua - 无法打开 Lua 场景 Spine 测试 Cocos2dx v4
- kubernetes - AWS ElasticIP 到 nginx 入口控制器 EKS?
- django - 从一个按钮上传多张图片
- laravel - 如何在 laravel 中使用 Request::create() 方法设置 cookie 并获得响应?
- c++ - 将对象设置为 null 是否与 C++ 中的垃圾收集相同?
- python - 从 MATLAB 转换的 Python 代码的不同输出