2009-08-21 1 views
26

多くのイントロRの書籍とガイドは、data.frameを添付することから変数を名前で呼び出すことができます。私は常に$という表記法または角ブラケットスライス[,2]を使って変数を呼び出すことが好都合であることを発見しました。そうすれば、複数のdata.frameを混乱させずに使用したり、繰り返しを使用して関心のある列を連続して呼び出すことができます。人々はこのような行為についてどう思いますどのようにそれをattach()または変数を名前またはスライスで使用していますか?

を使用しないように:私はライン

1を含むGoogleの最近投稿coding guidelines for R)が添付気づきましたか?

答えて

25

私は絶対にアタッチしないでください。 withwithinはお友達です。

例コード:

> N <- 3 
> df <- data.frame(x1=rnorm(N),x2=runif(N)) 
> df$y <- with(df,{ 
    x1+x2 
}) 
> df 
      x1   x2   y 
1 -0.8943125 0.24298534 -0.6513271 
2 -0.9384312 0.01460008 -0.9238312 
3 -0.7159518 0.34618060 -0.3697712 
> 
> df <- within(df,{ 
    x1.sq <- x1^2 
    x2.sq <- x2^2 
    y <- x1.sq+x2.sq 
    x1 <- x2 <- NULL 
}) 
> df 
      y  x2.sq  x1.sq 
1 0.8588367 0.0590418774 0.7997948 
2 0.8808663 0.0002131623 0.8806532 
3 0.6324280 0.1198410071 0.5125870 

編集:ハドレーはコメントで変換言及しています。ここにいくつかのコードがあります:

> transform(df, xtot=x1.sq+x2.sq, y=NULL) 
     x2.sq  x1.sq  xtot 
1 0.41557079 0.021393571 0.43696436 
2 0.57716487 0.266325959 0.84349083 
3 0.04935442 0.004226069 0.05358049 
+3

'transform'は内部の別の便利なバリエーションです。 – hadley

+1

実際には、 'attach()'とは違って、 'with()'が関数を "解決"しないことに気がつきました。最初に 'printx < - function {print(x)}'を設定します。 'with(list(x = 42)、print(x))'と 'attach(list(x = 42));にもかかわらず' with(list(x = 42)、printx()) 'は失敗します。 printx() '成功! :( –

3

attach()を呼び出すたびにコードのバッチを複数回実行するのは簡単すぎるので、私はattach()を使用しない方がいいです。データフレームは毎回検索パスに追加され、不必要に拡張されます。もちろん、良いプログラミングの練習はコードブロックの最後にdetach()ですが、それはしばしば忘れられます。

代わりにxxx $ yまたはxxx [、 "y"]を使用します。より透明です。

もう1つの可能性は、データフレーム内で個々の変数を参照できるようにする多くの関数で使用できるdata引数を使用することです。例えばlm(z ~ y, data=xxx)である。

+0

時々私はさまざまなデータフレームとグローバル変数から呼び出していますが、このシステムでは不正な計算が実行されることはありません。 – Michelle

8

添付の主な問題は、望ましくない動作が発生する可能性があることです。ワークスペースに名前がxyzのオブジェクトがあるとします。ここで、xyzという名前の列を持つデータフレームabcを添付します。 xyzへのコード参照がオブジェクトまたはデータフレーム列への参照であることを保証できますか?あなたが添付ファイルを使用しない場合、それは簡単です。ちょうどxyzはオブジェクトを参照します。 abc $ xyzは、データフレームの列を参照します。

添付ファイルが教科書で頻繁に使用される主な理由の1つは、コードが短くなることです。

+0

私はいくつかの教科書が「これをしないでください、添付は例を単純化するために使用されています」と言うことに気付きました。 – Michelle

13

私はずっと単一のコマンドでattachと同等のものを得ることがwithを使用することを好む:

with(someDataFrame, someFunction(...)) 

これもsubsetが最初の引数であるフォームに自然につながる:

with(subset(someDataFrame, someVar > someValue), 
     someFunction(...)) 

ました私たちが選択したデータを操作することは明らかです。多くのモデリング関数はdatasubsetの両方の引数を持ちますが、datasubset引数を持たない関数にも当てはまるので、上記の使用はより一貫しています。

7

「アタッチ」は邪悪な誘惑です。がうまく動作する場所は、教室の設定にあります。ここで1つのデータフレームが与えられ、その1つのデータフレームで分析を行うためのコード行を書き込む予定です。ユーザーがassignementがで行われ、手渡されたら二度とそのデータを使用することはほとんどありません。

しかし、現実の世界で、より多くのデータフレームは、特定のプロジェクト内のデータのコレクションに追加することができます。さらに、類似したものに使用されるコードブロックをコピーして貼り付けることがよくあります。数ヶ月前に何かから借りたことがあり、どこから呼び出されたのかを覚えていないことがあります。このような状況では、以前の「添付」の使用によって溺れてしまいます。

2

私はattach()を使用しないことを好みますが、いくつかの機能を使用している場合には、オブジェクトの存続期間中にオブジェクト(この場合はdata.frame)を永続化する必要があるときにその場所があります。オブジェクトを使用するすべてのR関数にオブジェクトを渡すのではなく、必要に応じて1つの場所に保持して要素を呼び出す方が便利だと思います。

私が利用可能なメモリ量を知っていれば、私はそれを使用します。detach()data.frameは範囲外です。

私は意味がありますか?

3

Leoniと同様に、withwithinattachの完璧な代用品ですが、私はそれを完全に却下しません。私はRプロンプトで直接作業しているときにスクリプトを書く前にいくつかのコマンドをテストしたいときに、時々使用します。特にattachを実行した後、入力を書き、出力を表示するため、複数のコマンドをテストするときにattachwithwithinのより面白くて便利で無害なものにすることができます。

完了したら、あなたのデータはdetachにしてください。

関連する問題