2012-04-08 12 views
34

jobincomeという列を含むデータフレームxがあるとします。フレーム内のデータを参照するには、通常、job列のデータにはx$jobincome列にはx$incomeのコマンドが必要です。Rでattach()を使用することはお勧めできないのですが、代わりに何を使うべきですか?

ただし、コマンドattach(x)を使用すると、同じデータを参照するときにデータフレーム名と$シンボルを削除することができます。従って、x$jobjobとなり、x$incomeincomeとなる。

問題はRで多くの専門家が、その主な理由は何R.

でコーディングする際attach()コマンドを使用しない助言するということでしょうか?代わりに何を使うべきですか?

+4

1つの問題は、(あなたの例では) 'job'と呼ばれるメモリ内の他のオブジェクト、つまり' income'があるかもしれないということです。それらを使用したいが、データフレーム 'x'を' attach() 'したい場合は、オブジェクト' x $ job'と 'job'、または' x $ income'と 'income'を混在させるのは簡単です。 –

答えて

34

ときにそれを使用する方法:

私はあなたが一度に1つの矩形のデータセットでの作業のほとんどの統計パッケージ(例えばのStata、SPSS)で取得環境が欲しいとき、私はattach()を使用しています。

それを使用しない:異なる

はしかし、それは、あなたがいくつかの異なるデータセットを持っていたときにすぐに、粗リレーショナルデータベースとしてRを使用して、あなたが有効になっている場合は特に、読めなくなり非常に厄介でコードを取得データの四角形は、当時の問題に関連していて、おそらく、異なる長方形からのデータをマッチングする様々な方法で使用され、同じ名前の変数を持っています。

with()関数または多くの関数の引数data=は、attach()が魅力的な多くのインスタンスの優れた代替品です。

+5

+1に「〜」を示唆します。あなたが 'attach 'よりも優れている入力/入力ミスを救うために探しているなら。 – Wayne

12

attachを使用しても問題はないと思います。私自身はそれを使用しません(再び、私は動物が大好きですが、何も持たない)。私がattachを考えると、私は長期的に考えると思います。確かに、私がスクリプトで作業しているとき、私はそれを内側と外側で知っています。しかし、私がスクリプトに戻って1週間、1ヶ月、または1年のうちに、特定の変数がどこから来たのか、あまりにも高価であるのかを調べることでオーバーヘッドが見つかります。多くのメソッドにはdataという引数があり、変数を簡単に呼び出すことができます(sensu lm(x ~ y + z, data = mydata))。そうでない場合、私はwithの使用を私の満足度に見いだします。

要するに、簡単なデータ探査のための添付は問題ありませんが、使用したいスクリプトを開発するために、コードをできるだけ読みやすく(転送可能な)ようにしています。

+1

+1は 'data ='がそれを持っているさまざまなコマンドで同じタスクを達成するかもしれないことを指摘しています。 – Wayne

17

attachを使用しない別の理由は、読み取り(アクセス)専用のデータフレームの列の値にアクセスできるようにすることです。その列の現在の値の略語ではありません。二つの例:

> head(cars) 
    speed dist 
1  4 2 
2  4 10 
3  7 4 
4  7 22 
5  8 16 
6  9 10 
> attach(cars) 
> # convert stopping distance to meters 
> dist <- 0.3048 * dist 
> # convert speed to meters per second 
> speed <- 0.44707 * speed 
> # compute a meaningless time 
> time <- dist/speed 
> # check our work 
> head(cars) 
    speed dist 
1  4 2 
2  4 10 
3  7 4 
4  7 22 
5  8 16 
6  9 10 

変更がdistspeedが割り当てられたにもかかわらずセットcarsデータに行われませんでした。

明示的にデータセットに割り当てられている場合は...コンピューティングtimeで参照される

> head(cars) 
    speed dist 
1  4 2 
2  4 10 
3  7 4 
4  7 22 
5  8 16 
6  9 10 
> attach(cars) 
> # convert stopping distance to meters 
> cars$dist <- 0.3048 * dist 
> # convert speed to meters per second 
> cars$speed <- 0.44707 * speed 
> # compute a meaningless time 
> cars$time <- dist/speed 
> # compute meaningless time being explicit about using values in cars 
> cars$time2 <- cars$dist/cars$speed 
> # check our work 
> head(cars) 
    speed dist  time  time2 
1 1.78828 0.6096 0.5000000 0.3408862 
2 1.78828 3.0480 2.5000000 1.7044311 
3 3.12949 1.2192 0.5714286 0.3895842 
4 3.12949 6.7056 3.1428571 2.1427133 
5 3.57656 4.8768 2.0000000 1.3635449 
6 4.02363 3.0480 1.1111111 0.7575249 

distspeedは、元の(未変換)の値です。 carsを付けたときの値はcars$dist,cars$speedであった。

+0

私が気に入らないのは、方程式の左側に "cars $"を使用する必要があるということです。 – skan

7

attach(data)複数回、たとえば5回実行すると、データがワークスペース環境で5回アタッチされていることがわかります(search()の助けを借りて)。ですので、一度それを解除すると(detach(data))、まだ環境内にはdataが4回存在します。したがって、with()/within()がより良いオプションです。そのオブジェクトを含むローカル環境を作成するのに役立ち、混乱を招くことなく使用できます。

関連する問題