2017-10-13 11 views
-1

経由文の周りのテキストをシフト:は、私はそうのような映画の名前を持つRのデータフレームを持つR

Shawshank Redemption, The 
Godfather II, The 
Band of Brothers 

私は、これらの名前を表示したいと思います:誰がどのように助けることができる

The Shawshank Redemption 
The Godfather II 
Band of Brothers 

上記のようなコンマの後に 'The'があるかどうかを確認するためにデータフレームの各行をチェックし、もしあれば、それを文の先頭に移動しますか?

+0

カンマの後に2つの「The」がありますが、2番目のカンマの後に移動しました。それで、それは両方か唯一ですか? – useR

+0

文章をRで印刷する方法を更新しました。これが理にかなっているかどうかを確認してください。 – ckdf14

答えて

1

あなたがgsub使用することができます。

df$movies2 = gsub("^([\\w\\s]+),*\\s*([Tt]he*($|(?=\\s\\(\\d{4}\\))))", "\\2 \\1", df$movies, perl = TRUE) 

結果:

> df 
          movies       movies2 
1 Shawshank Redemption, The (1994) The Shawshank Redemption (1994) 
2    Godfather II, The    The Godfather II 
3     Band of Brothers    Band of Brothers 
4    Dora, The Explorer    Dora, The Explorer 
5    Kill Bill Vol. 2 The   Kill Bill Vol. 2 The 
6     ,The Highlander     ,The Highlander 
7     Happening, the     the Happening 

データ:

df = data.frame(movies = c("Shawshank Redemption, The (1994)", 
          "Godfather II, The", 
          "Band of Brothers", 
          "Dora, The Explorer", 
          "Kill Bill Vol. 2 The", 
          ",The Highlander", 
          "Happening, the"), stringsAsFactors = FALSE) 

注:

正規表現全体の目標はグループに最初の部分(,前の部分)と第二の部分(「」,後とする場合にのみ、それは終わりか(year)前だ)であります私は、文字列の先頭から\\2\\1

  • ^([\\w\\s]+)マッチ任意の単語文字またはスペース1回以上と交換することができ、別のキャプチャグループに 本の
  • ,*\\s*マッチコンマとスペースの両方がゼロ回以上
  • [Tt]he*マッチ「の文字列の末尾」に一致それは($|(?=\\s\\(\\d{4}\\)))が続いていることを「a」または「an」は、ゼロ回以上
  • 注意、$、又は前のパターンの後に前のパターンが続いているかどうかをチェックする肯定的な先読みは、括弧を含む(4 digits)に一致します。ダブルバックスラッシュを単一のバックスラッシュ
  • を逃れるために必要とされているので、([Tt]he*($|(?=\\s\\(\\d{4}\\))))マッチ「」または「」文字列の末尾か、括弧で(4 digits)
  • すべてが続いているかのどちらかをキャプチャグループなので、\\2 \\1は、最初のスワップ"012"が[Tt]he*で0回以上しか一致しないため、文字列に "The"が含まれていない場合、空の文字列がスワップされます。\\1元の文字列を返します。
+0

'' gsub() 'の正規表現について説明できますか?映画のタイトルがShawshank Redemption、The(1994)"のように見えて、(1994)を最後に残して、あなたはそれを持っているように '正面に'?可能? – ckdf14

+0

「ドラエクスプローラ」はどうですか?あなたはまたそれが "Explorer Dora"になることを望みますか?またはあなただけの年を残したいですか? – useR

+0

Dora oneはうまくいきます。 Shawshank Redemption、The(1994)ではなく、The Shawshank Redemption(1994)を読んでいます。 – ckdf14

0

これは私のために働くようだ:これは「」最後以外の名前でどこからが削除されないことを

#create a vector of movies 
x=c("Shawshank Redemption, The", "Godfather II, The", "Band of Brothers") 

#use grep to find those with ", The" at the end 
the.end=grep(", The$",x) 

#trim movie titles to remove ", The" 
trimmed=strtrim(x[the.end],nchar(x[the.end])-5) 

#add "The " to the beginning of the trimmed titles 
final=paste("The",trimmed) 

#replace the trimmed elements of the movie vector 
x[the.end]<-final 

#take a look 
x 

が注...私はそれはあなたが望む行動だと思います。カンマなしの「The」、または小文字の「The」も欠落します。私が何を意味するかを確認するには、あなたの最初の映画のベクトルとしてこれを試してみてください。

#create a vector of movies 
x=c("Shawshank Redemption, The", "Godfather II, The", "Band of Brothers", 
    "Dora, The Explorer", "Kill Bill Vol. 2 The", ",The Highlander", 
    "Happening, the") 
+0

はい、うまくいくようですが、もっと恣意的に行うことは可能ですか?意味するところは、データベースから映画のリストを引っ張った場合、最後の位置に「The」があるかどうかを調べるために、それぞれの映画をチェックしたいと思います。 – ckdf14

+0

ここで "x"は単なる例ですが、ムービーのリストをダウンロードしてこのコードに名前のベクトルを渡した場合も、同じように動作します。 ダウンロードしたリストからベクトルに名前を取得する方法を理解する必要がありますが、とにかくそれらをRに渡す必要があります。 このコードをより堅牢にするには、このコードの出力を同じコードの2番目のコピーに渡します。ここで、grep()の "The $"を "、$"または "The $ "(答えの最後に述べた欠点を捕らえるため)。コードを関数に変換すると、そのことが可能になります。 –

+0

だから、私はintのように、それぞれのムービーの名前に対応するデータフレームの列を取り、ベクトルに配置し、上記のコードを実行することができます。それはうまくいくと思います。ありがとう。 – ckdf14

関連する問題