我有一列包含一些数字和字符串,我尝试为 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 的。
请帮忙。
您可以使用
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。