簡體   English   中英

R - select 一個正則表達式

[英]R - select a regular expression

我想 select 每一行我們可以找到表達式“X01”或“X02”:

dataEx <- data.frame(code = c("X01-X043","X034","X024","X015-X036-X033","X012","X015-X042","X019","X036","X022-X043"),res = NA )
pat1 <- c("(^|-)X01($|-|.)","(^|-)X02($|-|.)")
dataEx$res[grep(paste(pat1,collapse="|"),dataEx$code)] <- "ok"

它可以正常工作並給我結果:

            code  res
1       X01-X043   ok
2           X034 <NA>
3           X024   ok
4 X015-X036-X033   ok
5           X012   ok
6      X015-X042   ok
7           X019   ok
8           X036 <NA>
9      X022-X043   ok

但我想知道找到哪種模式:

            code  res
1       X01-X043   X01
2           X034 <NA>
3           X024   X024
4 X015-X036-X033   X015
5           X012   X012
6      X015-X042   X015
7           X019   X019
8           X036 <NA>
9      X022-X043   X022

我對正則表達式很陌生。 有沒有簡單的方法來做到這一點? (實際上,“pat1”要長得多,我正在尋找 20 種不同的模式)

您可以通過這種方式使用str_extract

library(stringr)
dataEx$res <- str_extract(dataEx$code, "X0(1|2)\\d?")

在這里,我們希望匹配文字X0后跟12 d另一個可選數字。

結果:

dataEx
            code  res
1       X01-X043  X01
2           X034 <NA>
3           X024 X024
4 X015-X036-X033 X015
5           X012 X012
6      X015-X042 X015
7           X019 X019
8           X036 <NA>
9      X022-X043 X022

你願意使用弦樂 package 嗎? 我同意 Jaskeil 的觀點,我更喜歡 data.table 而不是 data.frame,但這主要是為了提高執行速度。 不確定這是否會影響您的應用程序。

library(stringr)
dataEx <- data.frame(code = c("X01-X043","X034","X024","X015-X036-X033","X012","X015-X042","X019","X036","X022-X043"),res = NA )
dataEx$res <- str_extract(dataEx$code, "((^|-)X01($|-|.))|((^|-)X02($|-|.))")

你可以這樣做:

a <- regmatches(dataEx$code, gregexpr(paste(pat1, collapse = "|"), dataEx$code))
is.na(a)<-lengths(a)==0

dataEx$res <- unlist(a)

但問題是如果一排有不止一場比賽怎么辦?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM