web-dev-qa-db-ja.com

パターンに従ってRの部分文字列を抽出する

string = c("G1:E001", "G2:E002", "G3:E003")という文字列のリストがあるとします。コロン ":"の後の部分だけを含む文字列のベクトル、つまりsubstring = c(E001,E002,E003)を取得したいと思います。 Rにこれをする便利な方法はありますか? substrを使用するありがとうございます。

104
alittleboy

いくつかの方法があります。

1)sub

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

2)strsplit

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

)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

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"

追加しました。 strapplycおよびread.dcfソリューション.

注意。

入力stringは次のように想定されています。

string <- c("G1:E001", "G2:E002", "G3:E003")
171
G. Grothendieck

例えばgsubまたはsubを使用する

    gsub('.*:(.*)','\\1',string)
    1] "E001" "E002" "E003"
22
agstudy

これはもう一つの簡単な答えです

gsub("^.*:","", string)
9
Ragy Isaac

パーティーの後半になりましたが、後世のために、stringrパッケージ(人気のある "tidyverse"パッケージの一部)は文字列処理のための調和したシグネチャを持つ関数を提供します:

string <- c("G1:E001", "G2:E002", "G3:E003")
stringr::str_extract(string = string, pattern = "E[0-9]+")
# [1] "E001" "E002" "E003"
5
CSJCampbell

これはする必要があります:

gsub("[A-Z][1-9]:", "", string)

与える

[1] "E001" "E002" "E003"
4
user1981275

data.tableを使っているのなら、tstrsplit()が自然な選択です。

tstrsplit(string, ":")[[2]]
[1] "E001" "E002" "E003"
1
sindri_baldur