web-dev-qa-db-ja.com

文字列の一部を削除する

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

77
Lisann

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

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

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

111
Joshua Ulrich

このために組み込みのstrsplitを使用できます。

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

strsplitは、splitパラメーターで解析されたboth文字列の一部をlist。それはおそらくあなたが望むものではないので、呼び出しをunlistでラップし、次にindexその配列の2番目のベクター内の要素が返されます。

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

31
doug

strsplitがベクトルの場合のsソリューションは次のとおりです。

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

あなたがTidyverseのような人なら、ここに stringr ソリューションがあります:

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"
15
naught101

ここで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
3
KK_63

おそらく最も直感的な解決策は、おそらくストリンガー関数str_replaceを使用することです。

この例で唯一注意が必要なのは、アンダースコアを保持することですが、その可能性はあります。指定した文字列パターン(?=pattern)が見つかるまで、正規表現と一致する必要があります。

例を参照してください:

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

[1] "_1121" "_1432" "_1121"
0
Agile Bean