R の文字列から最初の文字を削除する
R は、統計分析のプログラミング環境としてよく知られています。それは数字を分析することを意味しますが、統計は数字だけではありません。単語のインスタンスを数える必要がある場合や、文字列から最初の文字を削除する必要がある場合があります。
R は、文字列を分析および操作するための多くの関数を提供します。一部の機能はベース R に組み込まれていますが、パッケージを通じてさらに多くの機能を利用できます。
この記事では、文字列から最初の文字を削除する 3つの手法に焦点を当てています。
テクニックに飛び込む前に、これらの 2つのポイントに注意することが重要です。
- R では、ベクトルの要素のインデックスは 0 ではなく 1 で始まります。ほとんどのプログラミング言語とは異なり、数学のベクトルと行列のインデックスに似ており、最後の範囲インデックスが範囲に含まれます。
- この記事のすべてのサンプルコードは、有効な値を使用します。これは、説明されている主要な概念に記事の焦点を合わせ続けるのに役立ちます。
文字列から最初の文字を削除するテクニック
文字列または文字列のベクトルから最初の文字を削除するための 3つの手法を検討します。
- R の基本関数
substr()
関数。 - 正規表現を使用したベース R
sub()
関数。 stringr
パッケージのstr_sub()
関数。
単一の文字列と文字列のベクトルの両方で理解を容易にするための各手法を示します。
例の文字列として単語辞書を使用します。R の結合関数 c()
を使用して、3つの文字列のベクトルを作成します。
ベクトルを構成する単語は、辞書、シソーラス、日記です。次のコードは、ベクトルを作成します。
サンプルコード:
myVector = c('dictionary', 'thesaurus', 'diary')
出力:
> myVector = c('dictionary', 'thesaurus', 'diary')
substr()
関数を使用する
最初の手法では、基数 R の substr()
関数を使用して、文字列から最初の文字を削除します。この機能の使い方のポイントは以下のとおりです。
substr()
関数は文字列の一部を抽出します。- 3つの引数が必要です。
- 最初の引数はテキストの文字列です。R の用語では、文字列は文字ベクトルであり、その各文字には位置インデックスがあります。
- 2 番目の引数は、部分文字列を開始するための文字のインデックスです。最初の文字のインデックスは 1 です。
- 3 番目の引数は、部分文字列を終了するための文字のインデックスベクトルです。最後の文字のインデックスは、文字列の長さと同じです。
以下のサンプルコードでは、サブストリングをインデックス 2 で開始し、サブストリングを最後の文字のインデックス位置で終了するため、ストリングの最初の文字が削除されます。
サンプルコード:
substr('dictionary', 2,10)
出力:
> substr('dictionary', 2,10)
[1] "ictionary"
ほとんどの場合、1つの個別の文字列を処理することはありません。文字列のベクトルがあり、ベクトルの各文字列から最初の文字を削除する必要があります。
文字列のベクトルで substr()
関数を示すために、ベース R から新しい関数 nchar()
を導入します。
nchar()
関数は、文字列のベクトルの各要素の文字数を示します。なぜこの関数が必要なのですか?substr()
を使用して部分文字列を抽出するには、部分文字列を停止する文字のインデックスを渡す必要があります。
前の例では、最初の文字だけを削除したかったのです。この目的のために、文字列の最後の文字のインデックス位置を使用しました。1つの単語の例では、最後の文字の位置に特定の数値を指定しました。
異なる長さの文字列のベクトルがある場合、各文字列の最後の文字のインデックス位置を指定する一般的な方法が必要です。nchar()
関数を使用すると、これを実行できます。
たとえば、nchar('dictionary')
は 10
を与えます。文字列 dictionary
の文字数です。また、インデックス付けは R の 1 から始まるため、この文字列の最後の文字のインデックス位置は 10 です。
同じ substr()
関数を引き続き使用して、文字列のベクトルを処理します。ただし、この場合の 2つの大きな違いに注意してください。
substr()
の最初の引数は、文字列のベクトルになりました。 (これは文字ベクトルのベクトルです。)substr()
が各ベクトル要素に適用されると、nchar()
はその要素の文字数を渡します。手続き型プログラミング言語とは異なり、各ベクトル要素を反復処理するためのループを作成する必要はありません。
以下のコードは、各ベクトル要素から最初の文字を削除します。
サンプルコード:
substr(myVector, 2, nchar(myVector))
出力:
> substr(myVector, 2, nchar(myVector))
[1] "ictionary" "hesaurus" "iary"
正規表現で sub()
関数を使用する
正規表現は、非常に複雑な文字列パターンマッチングシステムを指します。文字列のパターンを識別するための強力なツールです。
正規表現に関する一般的な説明は、この記事の範囲を超えています。この主題について数冊の本が書かれています。それでも、sub()
関数で正規表現を使用する必要があるため、基本的な機能のみを紹介します。
- ドット、またはピリオドは、任意の文字、任意の文字の単一インスタンスに一致します。
- 先頭のキャレット
^
は、文字列の先頭のパターンと一致します。
これらの 2つの文字を使用して、次の 2つの正規表現パターンを作成します。
- パターン(
.
)は任意の 1 文字に一致します。 - パターン
^
は、文字列の先頭にある任意の 1 文字と一致します。
ベース R の sub()
関数は、正規表現を使用して文字列から最初の文字を削除するパターンマッチングおよび置換関数です。
この機能の使用に関する主なポイントは次のとおりです。
- 関数の形式は
sub('searchpattern', 'replacement', 'string')
です。 - 最初の引数は、検索するパターンです。
- 2 番目は、検索パターンの最初のインスタンスが見つかったときにそれを置き換える文字列です。
- 3つ目は、パターンを検索してパターンを置き換える文字列です。
- デフォルトでは、この関数では大文字と小文字が区別されます。
- この関数は、検索パターンの最初のインスタンスのみを照合して置き換えます。
次のコードは、正規表現(検索パターン)としてドットを使用した sub()
関数を示しています。最初の一致である最初の文字は、A
に置き換えられます。
サンプルコード:
sub('.','A','dictionary')
出力:
> sub('.','A','dictionary')
[1] "Aictionary"
私たちの主なタスクは、文字列を置き換えるのではなく、文字列から最初の文字を削除することです。
この手法を使用して文字列の最初の文字を削除するには、2 番目の引数として空の文字列''
を使用する必要があります。コードを見てください。
サンプルコード:
sub('.','','dictionary')
出力:
> sub('.','','dictionary')
[1] "ictionary"
次の例は、すでに作成した文字列のベクトルを使用した sub()
関数を示しています。このコードは、ベクトルの各要素から最初の文字を削除します。
サンプルコード:
sub('.','', myVector)
出力:
> sub('.','', myVector)
[1] "ictionary" "hesaurus" "iary"
次のテクニックに進む前に、注意が必要です。ベース R には、別のパターンマッチングおよび置換関数 gsub()
があります。
gsub()
は、検索パターンの最初のインスタンスに一致して置換する sub()
関数とは異なり、検索パターンのすべてのインスタンスに一致して置換します。このセクションでは 2つの正規表現を紹介していますが、サンプルコードでは 1つしか使用していないことに気付いたかもしれません。
その理由は、sub()
関数では、検索パターンの最初のインスタンスにのみ一致するため、最初の文字に一致するにはドットだけで十分であるためです。gsub()
の動作は異なります。ドットはすべての文字に一致します。
サンプルコード:
gsub('.','A','dictionary')
出力:
> gsub('.','A','dictionary')
[1] "AAAAAAAAAA"
gsub()
がすべての文字を置換文字列(この場合は'A'
)に置き換えていることがわかります。次の例のように、gsub()
が文字列の先頭の検索パターンのみに一致するようにするには、ドットの前にキャレットを付ける必要があります。
サンプルコード:
gsub('^.','A','dictionary')
出力:
> gsub('^.','A','dictionary')
[1] "Aictionary"
文字列または文字列のベクトルから最初の文字だけを削除するタスクの場合、sub()
関数は、対応する gsub()
に比べて単純なオプションです。
stringr
パッケージを使用する
stringr
パッケージは、文字列から最初の文字を削除するための str_sub()
関数を提供します。ベース R の substr()
関数とは異なり、文字列のベクトルで str_sub()
関数を使用する場合、最後の文字のインデックス位置を取得するために nchar()
などの別の関数は必要ありません。
ただし、stringr
パッケージはこの機能を提供するため、ユーザーは最初にそのパッケージをインストールし(1 回限りのタスク)、使用する前に(各セッションで)ロードする必要があります。
str_sub()
関数の使用に関する主なポイントは次のとおりです。
- 関数は 3つの引数を取ります。
- 最初の引数は、文字列、または文字列のベクトルです。
- 2 番目の引数は、部分文字列を開始する場所からのインデックス位置です。最初の文字を削除するには、インデックス位置 2 から開始する必要があります。
- 3 番目の引数は、部分文字列を終了するインデックス位置です。文字列の最後まですべての文字を保持するには、最後の文字のインデックス位置である-1 を指定する必要があります。この機能が特に便利なのはこのためです。
基数 R の substr()
関数を使用する場合、nchar()
関数を使用して各文字列の最後の文字のインデックス位置を計算しました。ただし、str_sub()
関数は、負の整数を使用して文字列の末尾からのインデックス位置を指定します。
最後の文字のインデックス位置は-1 で、最後から 2 番目の文字のインデックス位置は-2 というように続きます。この機能により、この関数のみを使用して部分文字列を指定できます。
たとえば、str_sub('thesaurus',2,-1)
は、元の文字列のインデックス位置 2 から、つまり文字 h からサブ文字列の抽出(保持)を開始し、すべての文字をインデックス位置-1 まで保持します。元の文字列、つまり最後の文字 s。したがって、文字列 hesaurus
を返します。
このコードは、単一の文字列 dictionary
と作成した文字列のベクトルでの関数の使用法を示しています。
サンプルコード:
# Install the stringr package using the install.packages() function.
# This is a one-time task.
install.packages("stringr")
# Load the stringr package in each R session using the library() function.
library(stringr)
# Use of the str_sub() function on a string -- a character vector.
str_sub('dictionary', 2,-1)
# Use of the str_sub() function on a vector of strings.
str_sub(myVector, 2,-1) # Removes the first character.
出力(パッケージをインストールしてロードした後):
> # Use of the str_sub() function on a string -- a character vector.
> str_sub('dictionary', 2,-1)
[1] "ictionary"
>
> # Use of the str_sub() function on a vector of strings.
> str_sub(myVector, 2,-1) # Removes the first character.
[1] "ictionary" "hesaurus" "iary"
ヘルプを取得する
RStudio を使用すると、関数やコマンドに関する詳細情報を簡単に取得できます。
ヘルプ> R ヘルプ
をクリックして、RStudio インターフェイスの右下にあるファイル/プロット/パッケージ/ヘルプ/ビューア
ウィンドウにヘルプペインを表示します。
このページの上部にある検索ボックスを使用して、この記事に記載されている機能のいずれかを検索します。検索ボックスの関数名の後に括弧を入力しないでください。
ヘルプ>検索 R ヘルプ
をクリックすると、このページの検索ボックスにカーソルが移動します。
まとめ
文字列から最初の文字を削除するには、いくつかの手法を使用できます。ベース R substr()
関数はすぐに利用できますが、文字列のベクトル用に別のベース R 関数 nchar()
関数が必要です。
sub()
関数は強力ですが、そのすべての能力と複雑さは、文字列の最初の文字を削除するという単純なタスクを必要としません。str_sub()
関数は便利ですが、stringr
パッケージのインストールとロードが必要です。
これらの各手法は、期待される結果をもたらします。選択はユーザー次第です。