文字列の一部を削除します


90

文字列の一部を削除するにはどうすればよいですか?たとえば、のATGAS_1121前にすべてを削除したいです_

回答:


131

正規表現を使用します。この場合、次を使用できますgsub

gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"

この正規表現は、文字列の先頭(^)、0回以上繰り返される任意の文字(。)(*)、およびアンダースコア(_)に一致します。?一致を「レイジー」にして、一致するだけが最初のアンダースコアまでになるようにします。その一致は、アンダースコアだけに置き換えられます。参照の?regex詳細および参照について


6
たとえば、の場合、前の正規表現は最後のアンダースコアと一致しgsub("^.*_","_","ATGAS_1121_xxx")ます。修正されました。
リッチーコットン

7
@Joshua正規表現の役割を説明してくれたのは本当に助かりました。
Vasile 2015

これは、最後の引数として文字列のベクトルでも機能します。Rはそのように素晴らしいです。
naught101 2017

37

これには、組み込みのstrsplitを使用できます。

> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1    
 [1] "1121"

strsplitは、splitパラメーターで解析された文字列の両方の部分をリストとして返します。それはおそらくあなたが望むものではないので、呼び出しをunlistでラップし、その配列にインデックス付けて、ベクトル内の2つの要素の2番目だけが返されるようにします。

最後に、固定パラメーターをTRUEに設定して、分割パラメーターが正規表現ではなく、リテラルに一致する文字であることを示す必要があります。


23

あなたがTidyverseのような人なら、これがストリンガーソリューションです:

R> library(stringr)
R> strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
R> strings %>% str_replace(".*_", "_")
[1] "_1121" "_1432" "_1121"
# Or:
R> strings %>% str_replace("^[A-Z]*", "")
[1] "_1121" "_1432" "_1121"

21

がベクトルのstrsplit場合の解決策sは次のとおりです。

> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"

2
とても助かりました、ありがとう!参考までに、文字列の最初の部分(つまり、「_」の前)を取得するには、最後の[2]を[1]に置き換えます。
stevenjoe 2016年

4

おそらく最も直感的な解決策は、引数が2つではなく1つしかないため、さらに簡単なstringr関数を使用することです。str_removestr_replace

あなたの例の唯一のトリッキーな部分は、アンダースコアを保持したいということですが、それは可能です:指定された文字列パターンが見つかるまで正規表現に一致する必要があります(?=pattern)

例を参照してください。

strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% stringr::str_remove(".+?(?=_)")

[1] "_1121" "_1432" "_1121"

3

ここにパッケージstrsplitを使用したデータフレームのソリューションがありdplyrます

col1 = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
col2 = c("T", "M", "A") 
df = data.frame(col1, col2)
df
        col1 col2
1  TGAS_1121    T
2  MGAS_1432    M
3 ATGAS_1121    A

df<-mutate(df,col1=as.character(col1))
df2<-mutate(df,col1=sapply(strsplit(df$col1, split='_', fixed=TRUE),function(x) (x[2])))
df2

  col1 col2
1 1121    T
2 1432    M
3 1121    A
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.