2011-12-27 3 views
4

である私は、データセットにこのようなものがあります:サブセットのデータフレーム、そのうちの一つは、正規表現

col_a col_b col_c 
1  abc_boy 1 
2  abc_boy 2 
1  abc_girl 1 
2  abc_girl 2 

を私はcol_bcol_cに基づいて最初の行をピックアップして、変更する必要がありますこのようなものであるcol_cでvalye、:最初の条件と第二の基準は由来しないので

df[grep("_boy$",df[,"col_b"]) & df[,"col_c"]=="1","col_c"] <- "yes"

しかし、上記のコードは、OKではありません同じセット。

私は明示的なループを使用してダムの方法でそれを行う、または「二層」サブセット化を行うことができ、このような何か:

df.a <- df[grep("_boy$",df[,"col_b"]),]    #1 
df.b <- df[grep("_boy$",df[,"col_b"],invert=TRUE),] #2 
df.a <- df.a[df.a[,"col_c"]=="1","col_c"] <- "yes" #3 
df.a <- df.a[df.a[,"col_c"]=="2","col_c"] <- "no" #4 
df <- rbind(df.a,df.b)        #5 

しかし、私は、誰がどのように私を啓発することができますしたくありません「マージ」する#1#3?ありがとう。

+1

サンプル入力と一緒にサンプルを出力してください。あなたがしようとしていることははっきりしていません。 –

答えて

6

grepの代わりにgreplを試してください。 greplは、論理演算子と組み合わせることができる論理ベクトル(xの各要素に一致するかどうか)を返します。

6

正しいロジックにもかかわらず期待通りに動作しない理由は、を使用する必要があるgrepを使用していることです。代わりに試してみてください。この場合には、リサイクルますのでgrepは、短い数値ベクトルを返すのに対し、

df[ grepl("_boy$", df[,"col_b"]) & df[,"col_c"]=="1", "col_c"] <- "yes" 

> df 
    col_a col_b col_c 
1  1 abc_boy yes 
2  2 abc_boy  2 
3  1 abc_girl  1 
4  2 abc_girl  2 

greplは、その引数の長さの論理ベクトルをretruns。

関連する問題