5

次のような多数のファイル名を持つ列を持つデータフレームがあります。

d <- c("harry11_scott80_norm.avi","harry11_norm.avi","harry11_scott80_lpf.avi", 
       "joel51_lpf.avi","rich82_joel51_lpf.avi")

harry11_scott80_norm.aviRで、すべての式を式のように2人の名前に置き換え、すべての式を。のようにincongruent1人の名前に置き換えてほしい。私はそれを行うために使用することができます:harry11_norm.avicongruentgsub

dd <- gsub("harry11_scott80_norm.avi", "incongruent", d) 

しかし、私はそれらの名前をたくさん持っていたので、それは非常に不格好な解決策になるでしょう。したがって、理想的には、「incongruent」のような文字列を含む式全体を置き換えたいと思います_scott80_。私はそれgsubがこれを行うことができると思いました、しかし私がそれを実行するとき:

dd <- gsub("_scott80_", "incongruent", d)

と返されますharry11incongruentnorm.avi。これは、文字列の完全一致を単純に置き換えるためです。選択した文字列を含む式を完全に置き換えるように指示gsubする方法があると思いますが、見つかりません。

Rで、特定のパターンを含む文字列を別の文字列に置き換えるにはどうすればよいですか?agrep、しかし、このコンテキストでの使用方法がわかりません 。


編集:サイドボーナスの質問-@GSeeの回答に基づいて、置き換えたい文字列のリストを渡すことができる関数はありますか?たとえば、動作しgsub(c(".*_scott80_.*", ".*_harry11_.*"), "incongruent", d)ません。

4

2 に答える 2

16

これが1つの方法です

> gsub(".*_scott80_.*", "incongruent", d)
[1] "incongruent"           "harry11_norm.avi"      "incongruent"          
[4] "joel51_lpf.avi"        "rich82_joel51_lpf.avi"

またはとgrep

> d[grep("_scott80_", d)] <- "incongruent"
> d
[1] "incongruent"           "harry11_norm.avi"      "incongruent"          
[4] "joel51_lpf.avi"        "rich82_joel51_lpf.avi"

あなたの編集に対処するために、私はこれがそれを行うと信じています(|「または」を意味するために使用)

gsub(".*(_scott80_|_harry11_).*", "incongruent", d)

dもちろん、その一致に文字列はありません"_harry11_"

于 2012-11-07T18:14:20.437 に答える
5

ファイル名がすべて同じ形式である場合、つまり2つの名前を持つもの、つまりharry11_scott80_norm.avi 常に2つのアンダースコアがあり、1つの名前を持つもの、つまりharry11_norm.avi 常に1つのアンダースコアがある場合は、次のようなものを使用してファイルの名前をすばやく変更できます。

d = gsub(".*_.*_.*", "incongruent", d)
> d
[1] "incongruent"      "harry11_norm.avi" "incongruent"      "joel51_lpf.avi"  
[5] "incongruent"

d =gsub(".*_.*","congruent",d)
> d
[1] "incongruent" "congruent"   "incongruent" "congruent"   "incongruent"
于 2012-11-07T21:30:42.513 に答える