使用 R 从长字符串中提取部分单词到字段中
extract part of word into a field from a long string using R
我有一个带有 3 个 obs 的长字符串变量。我试图创建一个字段概率来从长字符串中提取特定字符串。代码和消息如下。
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, word( aa, 5, 5), 不适用))
警告消息:在 aa$prob <- ifelse(grepl("成为携带者的概率是",:将 LHS 强制到列表
这是我的 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", 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
是分词; none 这些“消耗”任何字符,它们只是标记开始和结束
.
表示一个字符
?
表示“零或一”,又名可选; *
表示“零个或多个”; +
表示“一个或多个”;全部参考前面的character/class/group
\s
为空白space,包括space和制表符
[0-9]
是一个class,表示0到9之间的任意字符;同样,[a-z]
全部是小写字母,[a-zA-Z]
全部是字母,[0-9A-F]
是十六进制数字,等等
(...)
为保存组;在小组中使用 |
作为“或”并不罕见;该组稍后在 gsub
的 replacement=
部分用作编号组,因此 \1
回忆模式 中的第一组
如此分组总结:
"^.*?\b([0-9]+\.?[0-9]*)\s*$"
1 ^^^^^^^^^^^^^^^^^^
2 ^^^
3 ^^^
4 ^^^^
- 这是“数字”部分,允许一位或多位数字、可选的小数点以及零位或多位数字。这保存在组“1”中。
- 单词边界保证我们包含前导数字(根据一些情况,
"12.345"
可能被解析为 "2.345"
而没有这个。
- 类似数字的字符串之前的任何内容。
- 数字后有或没有空格 space。
以有条理的方式进行逻辑分组
正则表达式不是 R 独有的,它是 R(和大多数其他编程语言)以某种方式支持的一种解析语言。
我有一个带有 3 个 obs 的长字符串变量。我试图创建一个字段概率来从长字符串中提取特定字符串。代码和消息如下。
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, word( aa, 5, 5), 不适用))
警告消息:在 aa$prob <- ifelse(grepl("成为携带者的概率是",:将 LHS 强制到列表
这是我的 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", 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
是分词; none 这些“消耗”任何字符,它们只是标记开始和结束.
表示一个字符?
表示“零或一”,又名可选;*
表示“零个或多个”;+
表示“一个或多个”;全部参考前面的character/class/group\s
为空白space,包括space和制表符[0-9]
是一个class,表示0到9之间的任意字符;同样,[a-z]
全部是小写字母,[a-zA-Z]
全部是字母,[0-9A-F]
是十六进制数字,等等(...)
为保存组;在小组中使用|
作为“或”并不罕见;该组稍后在gsub
的replacement=
部分用作编号组,因此\1
回忆模式 中的第一组
如此分组总结:
"^.*?\b([0-9]+\.?[0-9]*)\s*$"
1 ^^^^^^^^^^^^^^^^^^
2 ^^^
3 ^^^
4 ^^^^
- 这是“数字”部分,允许一位或多位数字、可选的小数点以及零位或多位数字。这保存在组“1”中。
- 单词边界保证我们包含前导数字(根据一些情况,
"12.345"
可能被解析为"2.345"
而没有这个。 - 类似数字的字符串之前的任何内容。
- 数字后有或没有空格 space。
以有条理的方式进行逻辑分组
正则表达式不是 R 独有的,它是 R(和大多数其他编程语言)以某种方式支持的一种解析语言。