删除dataframe列(R)中的部分字符串

时间:2014-08-13 02:29:02

标签: r

我有一个带有列(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)

但它不起作用。

3 个答案:

答案 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" 

仍然获得数字