18

如果我有这些字符串:

mystrings <- c("X2/D2/F4",
               "X10/D9/F4",
               "X3/D22/F4",
               "X9/D22/F9")

我怎样才能提取2,9,22,22. 这些字符介于/和 中的第一个字符之后/

我想以矢量化方式执行此操作,并在transfrom可能的情况下添加我熟悉的新列。

我认为这个正则表达式让我靠近所有字符\

^.*\\'(.*)'\\.*$
4

7 回答 7

29
> gsub("(^.+/[A-Z]+)(\\d+)(/.+$)", "\\2", mystrings)
[1] "2"  "9"  "22" "22"

您将“读取”(或“解析”)该正则表达式模式,将任何匹配的字符串分成三个部分:

1) 任何直到并包括第一个正斜杠后跟一系列大写字母的内容,

2) 下一个斜杠之前的序列中的任何数字(= "\d") 和 ,

3) 从下一个斜线到结尾。

然后只返回第二部分....

不匹配的字符串将原封不动地返回。

于 2013-01-03T20:14:21.270 回答
20

as.numeric(gsub("^.*D([0-9]+).*$", "\\1", mystrings))

于 2013-01-03T20:11:15.927 回答
8

str_extractstringr包中使用:

as.numeric(str_extract(mystrings, perl('(?<=/[A-Z])[0-9]+(?=/)')))
于 2013-01-03T20:13:43.827 回答
8

@Arun 抢了我的风头,所以我给出了我最初的冗长示例。

cut.to.pieces <- strsplit(mystrings, split = "/")
got.second <- lapply(cut.to.pieces, "[", 2)
get.numbers <- unlist(got.second)
as.numeric(gsub(pattern = "[[:alpha:]]", replacement = "", x = get.numbers, perl = TRUE))
[1]  2  9 22 22
于 2013-01-03T20:18:45.747 回答
4

这最终成为@RomanLuštrik 答案的压缩版本:

gsub("[^0-9]","",sapply(strsplit(mystrings,"/"),"[",2))
[1] "2"  "9"  "22" "22"
于 2013-01-03T20:21:29.867 回答
1

使用rex可能会使这种类型的任务更简单一些。

matches <- re_matches(mystrings,
  rex(
    "/",
    any,
    capture(name = "numbers", digits)
    )
  )

as.numeric(matches$numbers)
#>[1]  2  9 22 22
于 2014-11-26T20:51:59.297 回答
0

使用包脱胶你可以做:

# install.packages("unglue")
library(unglue)

unglue_vec(mystrings, "{x}/{y}/{z}", var = "y")
#> [1] "D2"  "D9"  "D22" "D22"

从您可以使用的数据框中,unglue_unnest()因此无需使用transform()

df <- data.frame(col = mystrings)
unglue_unnest(df, col, "{x}/{y}/{z}", remove = FALSE)
#>         col   x   y  z
#> 1  X2/D2/F4  X2  D2 F4
#> 2 X10/D9/F4 X10  D9 F4
#> 3 X3/D22/F4  X3 D22 F4
#> 4 X9/D22/F9  X9 D22 F9

# or used unnamed subpatterns to keep only the middle value
unglue_unnest(df, col, "{=.*?}/{y}/{=.*?}", remove = FALSE)
#>         col   y
#> 1  X2/D2/F4  D2
#> 2 X10/D9/F4  D9
#> 3 X3/D22/F4 D22
#> 4 X9/D22/F9 D22

reprex 包(v0.3.0)于 2019-11-06 创建

更多信息:https ://github.com/moodymudskipper/unglue/blob/master/README.md

于 2019-11-06T12:20:28.860 回答