0

私はRを初めて使用するので、かなり単純な質問だと思うことに苦労しています。この質問のために、私は私にただの解決策を与える誰かを探していません。誰かが私に答えを説明してくれることを望んでいたので、あなたがしたことを単にコピーするのではなく、自分でそれを行うことを学ぶことができました。そうは言っても、ここに私の問題と質問があります。

Rでヒストグラムを作成しています。ユーザーがファイルを送信すると、そのファイルのデータを使用してヒストグラムが作成されます。その分はすでに設定され、実行されています。私が問題を抱えているのは、そのファイル名の一部だけを取得し、それを使用してヒストグラムのタイトルを作成する必要があるということです。ファイル名は少し怪物であり、次の命名規則に従います。

X_Y.doc.Z.x_y_z

私が必要とするそのファイル名の側面はYとZです。多くの人がgrepを使用していることは知っていますが、この場合の使用方法がわかりません。私はすでに??grepページを読み、grepの基本に精通していますが、どこから始めればよいのかよくわかりません。

最終的には、誰かがその件についてもアドバイスしてくれる場合は、Excelファイルからいくつかの情報をgrepする必要があります。それが助けになるなら、これは私がファイルを受け入れる方法です:

F.n<-(tk_choose.files(default="", caption="Select a file", multi=TRUE, filters=NULL, index=1))

誰か提案はありますか?

4

3 に答える 3

3

を使用してすでに与えられた答えstringrは優れています。このパッケージは、非常に役立つ文字列変更ツールを提供します。

base のみを使用したい場合は、 でこれを行うことができますgsub。句読点が同じままで、X、Y、または Z にピリオドやアンダースコアが埋め込まれていないと仮定すると、このようなものが機能するはずです

f <- 'X_Y.doc.Z.x_y_z'
gsub('^.+_(.+)\\.doc\\.(.+)\\..+_.+$', '\\1 \\2', f)

戻り値:

"Y Z" 

ただし、各ピースを簡単に取得できるように、必要なものを何でも入れることができます。または、これを 2 行で実行して、それぞれ 1 つを返すこともできます。そして、R がその場でデータを変更することはほとんどないことを覚えておいてください。以下のように、関数の出力を変数に割り当てる必要があります。そうしないと、コンソールに出力されて「失われる」だけです (これはほとんどの場合に当てはまります)。

y <- gsub('^.+_(.+)\\.doc\\..+\\..+_.+$', '\\1', f)
z <- gsub('^.+_.+\\.doc\\.(.+)\\..+_.+$', '\\1', f)

それを分解しましょう。

^行頭を指定します。明示的であることは良いことです。同様$に、行の終わりを識別します。

.は任意の文字を表し、その後に+1 つ以上の任意の文字を意味します。.*代わりに使用.+すると、0 個以上の任意の文字を意味し、それは私たちが望んでいることではありません。通常の文字を書きたい場合.は、特殊文字であるためエスケープする必要があります。 \は、正規表現と R の両方のエスケープ文字です。つまり、2 つ必要です。通常の期間を書くには、書く必要があります\\.

念のためクリア。最後に、括弧は保存したいグループを表しています。保存した順序を示す番号を使用して、後で参照できます。一部の言語では、これらの括弧もエスケープする必要がありますが、R ではエスケープする必要はありません。

于 2012-08-16T14:28:42.557 に答える
2

grep は正規表現を使用して、パターンに一致する部分文字列を検索します。ファイル名から特定の要素を一致させるという問題については、キャプチャ グループを使用してさまざまな部分を抽出することをお勧めします。

キャプチャ グループを使用した正規表現の例は次のとおりです。

"Hello, (\w+)"

"Hello, Friend" 形式の文字列に一致します。パターンの説明は次のとおりです。

  • \w「単語文字」に一致しますが、
  • +少なくとも 1 つ、ただし複数のものが一致することを意味します。
  • ファイル名規則の他の構造部分については、そのまま含めることができますが、正規表現では特別な意味を持つ_ため、エスケープする必要があります。.
  • 照合するグループ (キャプチャ グループ) を定義するには、照合する部分を括弧で囲みます。(\w+)

これらすべてを使用すると、次のパターンが得られます。

"(\w+)_(\w+)\.doc\.(\w+)\.(\w+)_(\w+)_(\w+)"

パターンを R で機能させるには、すべての\文字を\\次のようにエスケープする必要があります。

> pattern = "(\\w+)_(\\w+)\\.doc\.(\\w+)\\.(\\w+)_(\\w+)_(\\w+)"

grep と regex は強力ですが、個人的にはインターフェイスがシンプルなstringrパッケージを好みます。特に、このstr_match関数は列 1 を含むマトリックスを返し、完全な一致を示し、後続のすべての列がキャプチャ グループへの一致を示すため、非常に役立ちます。 :

> x = "X_Y.doc.Z.x_y_z"
> str_match(x, pattern)

     [,1]              [,2] [,3] [,4] [,5] [,6] [,7]
[1,] "X_Y.doc.Z.x_y_z" "X"  "Y"  "Z"  "x"  "y"  "z" 

正規表現を初めて使用する場合は、このような言語のチュートリアルで問題ないはずです。構文はほとんど同じですが、すべての機能がすべてのプログラミング言語でサポートされているわけではなく、細部が異なるだけです。式をプログラムに組み込む前に試してみたい場合は、RegexPalを強くお勧めします。

于 2012-08-16T14:25:34.153 に答える
0

明確に定義された場所にある単一の文字が必要なだけのこの単純なケースでは、substrおそらくより単純になります。

> a <- "X_Y.doc.Z.x_y_z"
> substr(a, 3, 3)
[1] "Y"
> substr(a, 9, 9)
[1] "Z"
于 2012-08-16T15:01:22.507 に答える