2

データ フレームの部分一致に対処するにはどうすればよいですか? これが私の df df だとしましょう

   V1  V2  V3 V4
1 ABC 1.2 4.3  A
2 CFS 2.3 1.7  A
3 dgf 1.3 4.4  A

また、V1 の値の名前に「f」が含まれている場合にのみ番号 111 を含む列 V5 を追加し、V1 の値に「gf」が含まれている場合にのみ番号 222 を追加したいと考えています。いくつかの値に「f」が含まれているために問題が発生しますか? または、コマンドを実行する順序で問題が解決されますか?

私は次のようなものを試しました:

df$V5<- ifelse(df$V1 = c("*f","*gf"),c=(111,222) )

しかし、それは機能しません。

主な問題は、Rに「部分一致」を探すように指示するにはどうすればよいですか?

あなたの助けをありがとう!

4

2 に答える 2

1

シーケンス内の値を設定するソリューションに加えて、"f", "gf", ...ゼロ幅の先読み/後読みの正規表現機能を確認する価値があります。

"f"含むが含まないすべての行をgrepしたい場合"gf"は、

v1 <- c("abc", "f", "gf" )
grep( "(?<![g])f" , v1, perl= TRUE )
[1] 2

"f"そして、含むが含まないものだけをgrepしたい場合"fg"

v2 <- c("abc", "f", "fg")
grep( "f(?![g])" , v2, perl= TRUE )
[1] 2

そしてもちろん、それを混在させることができます:

v3 <- c("abc", "f", "fg", "gf")
grep( "(?<![g])f(?![g])" , v3, perl= TRUE )
[1] 2

あなたの場合、あなたができること

df[ grep( "(?<![g])f" , df$V1, perl= TRUE ), "V5" ] <- 111
df[ grep( "gf" , df$V1, perl= TRUE ), "V5" ] <- 222
于 2013-05-03T17:38:26.703 に答える
0
 df$V5 <- NA
 df$V5[grep("f", df$V1)] <- 111
 df$V5[grep("gf", df$V1)] <- 222  # obviously some of the "f" values could be overwritten.

私には密度が高すぎて理解できない関数がありますが、switchそれは常に Pascal のようにすべきだと思われていましたcase。奇妙なブール値から数値へのインデックス作成操作でそれを行うことができますが、それは役に立たない可能性があります。

于 2013-05-03T17:11:53.680 に答える