2011-12-15 12 views
1

私は非常によく似た質問が以前に尋ねられていることを知っていますが、私はそれらの古い投稿からの正確な質問に対する答えをまだ得ていません。 My機能「試験」のみデータフレームの列「COL」(.csvファイルから実際のデータ)上の「X」を実行する必要があるすなわちR:データフレーム(データフレームではない)の列のみをユーザー定義関数に送信

test <- function(x$col){...} 
: 
test(x$col) 

私はこの構文は動作しません知っています。だから私は実行する必要があります。

test <- function(x,col){...} 
: 
test(x$col) 

しかし、Rの機能は、本質的に非常にIN-ある関数「テスト」に渡されます、全体のデータフレームの「x」の値で渡すので、上記の問題は、あります効率的な方法、大規模な 'x'のesp!

test <- function(y){...} 
: 
y <- x$col 
test(y) 

しかし、これは良いではありません。

回避策があります。私は明白な理由がない奇妙な現象のために余分な行のコード/ベクトルを追加します!また、これは、コード内の他のどこでもその列にx$colを使用しているため、コードの可読性が複雑になります。

私の関数 'test'の引数として 'x'と 'col'(余分な変数はありません)の組み合わせを使用して列のコピーを送信する方法がありますか?

誰かが「test」関数の引数として列を送信できない理由を提案してもらえますか?また、常にメモリに入っていない可能性があるので、毎回x$colを使用するのは一般的に非効率ですか?

+2

完全なデータフレームを渡してから列を抽出することが実際には非効率的であることをテスト/確認できますか? Rは、必要でない限りコピーを作成しないようにするために適度に巧妙なものをいくつか行います。これについては、http://cran.r-project.org/doc/manuals/R-ints.htmlの1.1.2セクションを参照してください。 –

+1

data.frame全体を渡すことは非効率的ではありませんRはコピー・オン・ライトであるために見えます。 R Internalsにはより多くの情報がありますが、かなり技術的です。 http://cran.r-project.org/doc/manuals/R-ints.html#Rest-of-header。 @ PaulHiemstraの答えはあなたが探しているものだと私には思われます。 – Aaron

+1

@BenBolker:私はあなたが正しいと信じています。私は実際に同じ参照を見つけました。私はOPと同じ考えをしていましたが、複雑な関数の1つは実際に環境を書き換えようとしましたが、データのコピーを避けると思っていました。それが全くスピードアップしなかったとき、私はRのコピーオンライトメソッドを読みました。 – Aaron

答えて

4

が、これはうまく動作しません:

spam <- function(col) { 
    return(col*10) 
} 

dat <- data.frame(bla = 1:10, xi = 1:10) 

spam(dat$bla) 

私はblaが関数にその全体が渡されないと思います。私は設定をサブときに、新しいオブジェクトが作成されていることとdat$blaにおける値のみが渡されていることを疑う

> str(dat$bla) 
int [1:10] 1 2 3 4 5 6 7 8 9 10 

:見てみます。または私はここで完全に間違っていますか?

+0

ありがとうございます。しかし、データフレーム全体が渡されたと判断した私の理由は、関数spam内からsummary(dat)を呼び出すと、データフレームdat全体のサマリーを得ることになります。これを試してみてください。返信にもう一度感謝します! – Aditi

+0

これはおそらく、Rが使用するスコープと関係があります。オブジェクトは実際には関数に渡されませんが、Rが関数内でdatを見つけることができないときは、地球環境を調べます。スパムの中のコピーを見るのではなく、地球環境の元のオブジェクトを見ています。 –

1

わかりませんが、これはあなたが欲しいのですか?

#Your Data Frame 
x<-data.frame(matrix(rnorm(25),ncol=5)) 
x 

#A Function to text Something, you choose the data and the columm 
test.function<- function(data.frame,columm) { 
              data.frame[,columm]>0 
              } 
#Work either with the number of the columm            
test.function(x,1) 
#or de "name" of the columm 
test.function(x,"X1") 
+0

申し訳ありませんが...コードの読みやすさのためにこれを回避したいと思いました!あなたに役立つことを試みてくれてありがとう:) – Aditi

2

あなたがテストを呼び出す方法に依存するように起こっているが、これらのいずれかが答えである可能性があります。それがないので、あなたは、関数に引数を渡すときに「$」演算子を使用しないでください

test <- function(x,col){ x[[col]] } # for x being data.frame or list 

test <- function(x,col){ x[ , col] } # for x being data.frame or matrix 

"col"の値を何かに変換しないでください。それは、 "col"の名前で列を返そうとします。そして、それは一般に、関数に引数を渡すときにあなたが覚えるものではありません。一方、 "["と "[["関数はcolを評価し、渡した値で抽出します。

あなただけの単一の列を上の仕事をしたい場合は、これも可能性である:

test <- with(x, function(col) {col}) 
# obviously you could do more with col inside the braces 

with機能は「COL」は有効なオブジェクト名として解釈される環境を設定します。

+0

あなたの返信ありがとう! $を渡すとエラーになるので、避けるかどうかにかかわらず、関数に引数として渡すことはできません。 (x、col)を渡すと、x全体が関数に渡されます。私は間違っているかもしれませんが、私は関数spam内からsummary(x)を呼び出すと、データフレームx全体のサマリーを得るという観測に基づいてこれを結論付けました。 – Aditi

関連する問題