2012-02-27 3 views
5

私はいくつかの要因を含むdata.frameを持っています。これらの要因すべての因子レベルの名前を変更したいのです。例:実際の例では、2つの列以上の方法があることに注意してください。私は本当にないです適用ファミリー内の割り当て方法は?

apply(mydf,1,function(x) levels(x) <- c("1","0")) 

...私は次のことを試してみましたが、それはうまくいきませんでした

levels(mydf$col1) <- c("1","0") 

:したがって、私はちょうどのように、これらのすべての列に他のレベルの名前を割り当てるために適用されます使用したいですそれはうまくいきませんが、今はもっと良いアイデアはありません。おそらくwithを使用すべきでしょうか?

編集:私はここで過ちを単純化することによって間違いを犯したことを実感しました。私はを使って、NAsはもうNAとして扱うべきではないという事実を説明しました。したがって、私はまたそれらのラベルをつけたいと思う。 これはAndrieの提案と連携し、次のエラーメッセージが返されていません:私は私の例のDFを更新

labels = c("1", : invalid labels; length 2 should be 1 or 1 

注意を。

+0

あなたはNAレベルで何をしたいかは言いません。名前を何に変更しますか? – Andrie

+0

addNAを使用した後、私はレベル1とを持っています。そして、私はNAカテゴリーを0に改名することを好む - 彼らは通常の因子レベルであったように、そしてNAになったことは一度もありませんでした。 –

+0

@Charles:カテゴリタグで何が問題になっていますか?これは深刻な問題です。それは言語にとらわれないからですか?カテゴリ( 'factor')にR項を使用する方が良いとは言えませんでした。私は全体のアスペクトを去らなければならないのですか?なぜですか? –

答えて

8

bitまたはdata.tablesetattr()を参照してレベルを変更することができます。 ...これは、データセット全体をコピー回避し、あなたが言ったので、あなたは列の多くを持っている非常に高速で簡単なforループ内で行うことができます

require(bit)   # Either package 
require(data.table) # 
setattr(mydf[[1]],"levels",c("1","0")) 
setattr(mydf[[2]],"levels",c("1","0")) 

。レベルベクトルを同じ長さのベクトルに置き換えることを確実にするのはあなたの責任です。そうでなければ、その因子はもはや有効ではなくなります。そして、レベルベクトル全体をこのメソッドに置き換える必要があります。 data.tableには、参照によって特定のレベル名を置き換える内部的な方法がありますが、それほど遠くに行く必要はないでしょう。

+1

なぜattr(mydf [1]、 "levels")< - c( "1"、 "0") 'レベル(mydf [1])< - c(" 1 "、" 0 ")'? –

+2

@Joshua 'tracemem(mydf)'まず、_whole_オブジェクトの4つのコピーを見てください。 'tracemem'をonにして、' setattr() 'を試してください。次に 'mydf '行に10億行を渡し、' setattr() 'がうまく動作する(そして素早く)ときに'メモリ不足'で失敗するのを見てください。 –

+0

もちろん、data.frameをサブセット化しているからです。 1つのベクターに対する私のテストではコピーが作成されませんでした。説明をありがとう。 –

関連する問題