如何在 R 中提供子字符串然后提取其前面的数字?

问题描述 投票:0回答:1

我有一列包含一些数字和字符串,我尝试为 R 提供子字符串“sst”,然后提取出现在它之前的数字。

df1 <- structure (list(
  subject_id = c("191-5467", "191-6784", "191-3457", "191-0987", "191-1245", "191-1945"), 
 bloods = c("2 SST, 1 EDTA","1 EDTA 2 sst","1SST, 2 EDTA","2 EDTA, 1SST collected","2SST, 1EDTA","1 EDTA")), 
  class = "data.frame", row.names = c(NA, -6L))

所需输出:

主题_id num_sst
191-5467 2 SST,1 EDTA 2
191-6784 1 EDTA 2 不锈钢 2
191-3457 1SST,2EDTA 1
191-0987 收集 2 个 EDTA、1 个 SST 1
191-1245 2SST、1EDTA 2
191-1945 1 乙二胺四乙酸 0

我知道如何精确计算每一行中的所有数字,但因为没有特定的模式,所以很难看出哪个数字是 sst 的。

请帮忙。

r tidyverse gsub
1个回答
1
投票

您可以使用

str_extract
提取“SST”字符串之前的数字。

library(stringr)
library(dplyr)

df1 %>%
  mutate(num_sst = str_extract(bloods, "(\\d+)\\s?(?i)SST", group = 1),
         num_sst = replace(num_sst, is.na(num_sst), 0))

#  subject_id                 bloods num_sst
#1   191-5467          2 SST, 1 EDTA       2
#2   191-6784           1 EDTA 2 sst       2
#3   191-3457           1SST, 2 EDTA       1
#4   191-0987 2 EDTA, 1SST collected       1
#5   191-1245            2SST, 1EDTA       2
#6   191-1945                 1 EDTA       0

其中

(\\d+)
提取一个或多个数字,后跟可选的空格 (
\\s?
) 可选,因为并非每个数字后都跟有空格,并且“SST”不区分大小写,即它可以是“SST”或“sst”所以我们使用不区分大小写的标志(
?i
)。

如果没有数字满足条件

str_extract
返回
NA
,因为您需要 0,我们使用
replace
NA
替换为 0。

© www.soinside.com 2019 - 2024. All rights reserved.