1. ホーム
  2. regex

[解決済み] パターンに従って部分文字列を抽出する

2022-04-25 18:28:07

質問

文字列のリストがあるとします。

string = c("G1:E001", "G2:E002", "G3:E003")

ここで、コロン ":" の後の部分のみを含む文字列のベクトルを得たいと思います、すなわち substring = c(E001,E002,E003) .

Rでこれを行うための便利な方法はありますか?使用方法 substr ?

解決方法は?

ここでは、いくつかの方法を紹介します。

1) サブ

sub(".*:", "", string)
## [1] "E001" "E002" "E003"

2) strsplit

sapply(strsplit(string, ":"), "[", 2)
## [1] "E001" "E002" "E003"

3) read.table

read.table(text = string, sep = ":", as.is = TRUE)$V2
## [1] "E001" "E002" "E003"

4) 部分文字列

これは、2番目の部分が常に4文字目から始まることを想定しています(質問の例ではそうなっています)。

substring(string, 4)
## [1] "E001" "E002" "E003"

4a) 部分文字列/正規表現

もし、コロンが常に既知の位置にない場合は、(4)を検索して修正することができます。

substring(string, regexpr(":", string) + 1)

5)ストラップリク

strapplyc は括弧で囲まれた部分を返します。

library(gsubfn)
strapplyc(string, ":(.*)", simplify = TRUE)
## [1] "E001" "E002" "E003"

6) read.dcf

これは、コロンより前の部分文字列が一意である場合のみ機能します(質問の例ではそうなっています)。 また、セパレータがコロンであることも必要です(質問ではコロンになっています)。 もし別のセパレータを使うのであれば、次のようになります。 sub を最初にコロンに置き換えてください。 例えば、セパレータが _ すると string <- sub("_", ":", string)

c(read.dcf(textConnection(string)))
## [1] "E001" "E002" "E003"

7) 分離

7a) 使用方法 tidyr::separate のように、コロンの前の部分と後の部分の2列からなるデータフレームを作成し、後者を抽出する。

library(dplyr)
library(tidyr)
library(purrr)

DF <- data.frame(string)
DF %>% 
  separate(string, into = c("pre", "post")) %>% 
  pull("post")
## [1] "E001" "E002" "E003"

7b) 交互に separate を作成するためだけに使用することができます。 post 列を作成し、その後 unlistunname を実行すると、結果のデータフレームが表示されます。

library(dplyr)
library(tidyr)

DF %>% 
  separate(string, into = c(NA, "post")) %>% 
  unlist %>%
  unname
## [1] "E001" "E002" "E003"

8)トリミング を使用することができます。 trimws を使って単語を左から切り落とし、さらにそれを使ってコロンを切り落とす。

trimws(trimws(string, "left", "\\w"), "left", ":")
## [1] "E001" "E002" "E003"

備考

入力 string が想定されています。

string <- c("G1:E001", "G2:E002", "G3:E003")