使用 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]是十六进制数字,等等
  • (...)为保存组;在小组中使用 | 作为“或”并不罕见;该组稍后在 gsubreplacement= 部分用作编号组,因此 \1 回忆模式
  • 中的第一组

如此分组总结:

  "^.*?\b([0-9]+\.?[0-9]*)\s*$"
1         ^^^^^^^^^^^^^^^^^^
2      ^^^
3   ^^^
4                           ^^^^
  1. 这是“数字”部分,允许一位或多位数字、可选的小数点以及零位或多位数字。这保存在组“1”中。
  2. 单词边界保证我们包含前导数字(根据一些情况,"12.345" 可能被解析为 "2.345" 而没有这个。
  3. 类似数字的字符串之前的任何内容。
  4. 数字后有或没有空格 space。

以有条理的方式进行逻辑分组

正则表达式不是 R 独有的,它是 R(和大多数其他编程语言)以某种方式支持的一种解析语言。