文字列の一部を削除するにはどうすればよいですか?たとえば、のATGAS_1121
前にすべてを削除したいです_
。
回答:
正規表現を使用します。この場合、次を使用できますgsub
。
gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"
この正規表現は、文字列の先頭(^)、0回以上繰り返される任意の文字(。)(*)、およびアンダースコア(_)に一致します。?一致を「レイジー」にして、一致するだけが最初のアンダースコアまでになるようにします。その一致は、アンダースコアだけに置き換えられます。参照の?regex
詳細および参照について
これには、組み込みのstrsplitを使用できます。
> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1
[1] "1121"
strsplitは、splitパラメーターで解析された文字列の両方の部分をリストとして返します。それはおそらくあなたが望むものではないので、呼び出しをunlistでラップし、その配列にインデックスを付けて、ベクトル内の2つの要素の2番目だけが返されるようにします。
最後に、固定パラメーターをTRUEに設定して、分割パラメーターが正規表現ではなく、リテラルに一致する文字であることを示す必要があります。
がベクトルのstrsplit
場合の解決策s
は次のとおりです。
> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"
おそらく最も直感的な解決策は、引数が2つではなく1つしかないため、さらに簡単なstringr
関数を使用することです。str_remove
str_replace
あなたの例の唯一のトリッキーな部分は、アンダースコアを保持したいということですが、それは可能です:指定された文字列パターンが見つかるまで正規表現に一致する必要があります(?=pattern)
。
例を参照してください。
strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% stringr::str_remove(".+?(?=_)")
[1] "_1121" "_1432" "_1121"
ここにパッケージ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
gsub("^.*_","_","ATGAS_1121_xxx")
ます。修正されました。