如何解决使用 R 从长字符串中提取单词的一部分到字段中
我有一个带有 3 个 obs 的长字符串变量。我试图创建一个字段 prob 来从长字符串中提取特定的字符串。代码和消息如下。
data aa: "成为携带者的概率为 0.0002422359 " " BRCA1 携带者 0.0001061067 " " BRCA2 载体 0.00013612 "
在此处输入代码 aa$prob
警告信息:在 aa$prob
解决方法
这是我的 previous answer,已更新以反映 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",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"
。 - 类似数字的字符串之前的任何内容。
- 数字后有空格或没有空格。
按逻辑分组,有组织的方式
Regex 不是 R 独有的,它是 R(和大多数其他编程语言)以某种方式支持的一种解析语言。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。