首页 > 解决方案 > 使用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 强制到列表中

标签: rgrepl

解决方案


这是我以前的答案,更新以反映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. 这是“数字”部分,它允许一个或多个数字、一个可选的小数点以及零个或多个数字。这保存在组“1”中。
  2. 单词边界保证我们包含前导数字(根据一些事情,有"12.345"可能被解析为"2.345"没有这个。
  3. 类似数字的字符串之前的任何内容。
  4. 数字后有一些空格或没有空格。

以有组织的方式逻辑分组

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


推荐阅读