我有一个带有列(Col2)的数据帧(df),如下所示:
Col1 Col2 Col3
1 C607989_booboobear_Nation A
2 C607989_booboobear_Nation B
3 C607989_booboobear_Nation C
4 C607989_booboobear_Nation D
5 C607989_booboobear_Nation E
6 C607989_booboobear_Nation F
我想只提取Col2中的数字
Col1 Col2 Col3
1 607989 A
2 607989 B
3 607989 C
4 607989 D
5 607989 E
6 607989 F
我尝试过这样的事情:
gsub("^.*?_","_",df$Col2)
但它不起作用。
答案 0 :(得分:5)
如果你的字符串不是太花哨/复杂,最简单的做法是:
gsub("C([0-9]+)_.*", "\\1", df$Col2)
# [1] "607989" "607989" "607989" "607989" "607989" "607989"
以“C”开头,后跟数字,后跟下划线,然后是其他任何内容。使用()
捕获数字,并将替换设置为该捕获组(\\1
)。
答案 1 :(得分:2)
使用qdap::genXtract
的替代方法,可以在左右边界之间抓取字符串。在这里,我使用C
和_
作为左右边界:
## Your data in a better form for sharing
dat <- structure(list(Col1 = c("1", "2", "3", "4", "5", "6"), Col2 = c("C607989_booboobear_Nation",
"C607989_booboobear_Nation", "C607989_booboobear_Nation", "C607989_booboobear_Nation",
"C607989_booboobear_Nation", "C607989_booboobear_Nation"), Col3 = c("A",
"B", "C", "D", "E", "F")), .Names = c("Col1", "Col2", "Col3"), row.names = c(NA,
-6L), class = "data.frame")
library(qdap)
dat[[2]] <- unlist(genXtract(dat[[2]], "C", "_"))
dat
## Col1 Col2 Col3
## 1 1 607989 A
## 2 2 607989 B
## 3 3 607989 C
## 4 4 607989 D
## 5 5 607989 E
## 6 6 607989 F
答案 2 :(得分:1)
或者,您可以使用正则表达式lookbehind
library(stringr)
str_extract(dat$Col2, perl('(?<=[A-Z])\\d+'))
#[1] "607989" "607989" "607989" "607989" "607989" "607989"
(?<=[A-Z])
匹配,如果搜索到的子字符串前面跟一个固定长度的大写字母匹配。在这种情况下,它是1。
\\d+
要提取的模式/子字符串是数字。
在字符串中,这仅发生在C607989
_ booboobear_Nation。因此,它只提取该模式后面的数字
假设你有一个这样的字符串:
v1 <- c(dat$Col2, "booboobear_D600078_Nation")
str_extract(v1, perl('(?<=[A-Z])\\d+'))
#[1] "607989" "607989" "607989" "607989" "607989" "607989" "600078"
仍然获得数字