如何仅删除其他字符串之间带有 / 的一组数字?

How to remove just the set of numbers with / in between among other strings?

我需要从文本注释中提取血压值,该文本注释通常报告为一个较大的数字,“/”表示较小的数字,单位为 mm HG(它不是分数,只能这样写).在下面的 4 个示例中,我只想提取 114/46、135/67、109/50 和 188/98,之前或之后没有 space,并将顶部数字放在称为 SBP 的列中,底部数字进入名为 DBP 的列。 预先感谢您的协助。

bb <- c("PATIENT/TEST INFORMATION (m2): 1.61 m2\n BP (mm Hg): 114/46 HR 60 (bpm)", "PATIENT/TEST INFORMATION:\ 63\n Weight (lb): 100\nBSA (m2): 1.44 m2\nBP (mm Hg): 135/67 HR 75 (bpm)", "PATIENT/TEST INFORMATION:\nIndication: Coronary artery disease. Hypertension. Myocardial infarction.\nWeight (lb): 146\nBP (mm Hg): 109/50 HR (bpm)", "PATIENT/TEST INFORMATION:\nIndication: Aortic stenosis. Congestive heart failure. Shortness of breath.\nHeight: (in) 64\nWeight (lb): 165\nBSA (m2): 1.80 m2\nBP (mm Hg): 188/98 HR 140 (bpm) ")   

BP <- head(bb,4)
dput(bb)

您可以使用 str_match 和 select 之间的数字 /

as.data.frame(stringr::str_match(bb, "(\d+)/(\d+)")[, 2:3])

#   X1 X2
#1 114 46
#2 135 67
#3 109 50
#4 188 98

在 base R 中,我们可以提取遵循模式 a/b 的数字,将它们拆分为 '/' 并形成两列。

as.data.frame(do.call(rbind, strsplit(sub(".*?(\d+/\d+).*", "\1", bb), "/")))

您可以使用 setNames 或任何其他方法根据您的选择为他们提供列名。

基础 R 解决方案:

setNames(data.frame(do.call("rbind", strsplit(trimws(gsub("[[:alpha:]]|[[:punct:]][^0-9]+", "", 

     gsub("HR.*", "", paste0("BP", lapply(strsplit(bb, "BP"), '[', 2)))), "both"), "/"))),

     c("SBP", "DBP"))

我们可以使用 regmatches/regexprbase R 中提取所需的值,然后使用 read.table,创建两列 data.frame

read.table(text = regmatches(bb, regexpr('\d+/\d+', bb)), 
      sep="/", header =  FALSE, stringsAsFactors = FALSE)
#   V1 V2
#1 114 46
#2 135 67
#3 109 50
#4 188 98

或使用 base R

中的 strcapture
strcapture( "(\d+)\/(\d+)", bb, data.frame(X1 = integer(), X2 = integer()))
#   X1 X2
#1 114 46
#2 135 67
#3 109 50
#4 188 98

要将其创建为原始 data.frame 中的新列,请使用 cbind 将输出与原始数据集绑定

cbind(data, read.table(text = ...))

data[c("V1", "V2")] <- read.table(text = ...)

或使用 tidyr

中的 extract
library(dplyr)
library(tidyr)
tibble(bb) %>%
      extract(bb, into = c("X1", "X2"), ".*\b(\d+)/(\d+).*", convert = TRUE)
# A tibble: 4 x 2
#     X1    X2
#  <int> <int>
#1   114    46
#2   135    67
#3   109    50
#4   188    98

如果我们不想删除原来的列,在extract

中使用remove = FALSE