如何仅删除其他字符串之间带有 / 的一组数字?
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/regexpr
从 base 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
我需要从文本注释中提取血压值,该文本注释通常报告为一个较大的数字,“/”表示较小的数字,单位为 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/regexpr
从 base 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