文字列の一部を削除するにはどうすればよいですか?たとえば、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パラメーターで解析されたboth文字列の一部をlist。それはおそらくあなたが望むものではないので、呼び出しをunlistでラップし、次にindexその配列の2番目のベクター内の要素が返されます。
最後に、fixedパラメーターをTRUEに設定して、分割パラメーターが正規表現ではなく、リテラル一致文字であることを示す必要があります。
strsplit
がベクトルの場合のs
ソリューションは次のとおりです。
> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"
あなたが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"
ここで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
おそらく最も直感的な解決策は、おそらくストリンガー関数str_replace
を使用することです。
この例で唯一注意が必要なのは、アンダースコアを保持することですが、その可能性はあります。指定した文字列パターン(?=pattern)
が見つかるまで、正規表現と一致する必要があります。
例を参照してください:
strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% str_remove(".+?(?=_)")
[1] "_1121" "_1432" "_1121"