2012-01-06 6 views
3

ノート内:これは、直接このprevious questionmapply ddply


にフォローアップ私は第三の値を見つける関数の引数として使用しています2つの列からなる非常に長いデータフレームを持っていますコラムようにmapply使用して:私はこれを適用することであろう問題にアプローチするための良い方法を考えていたので、これは小さなデータセットのための素晴らしい作品ながらmyfunctionは、引数AとBを持っている

df$3rd <- mapply(myfunction, A=df$1st, B=df$2nd) 

が、それは大規模なデータセットのためのストールを使用して機能。私はddplyがこの問題の最善のアプローチであるかどうかわかりませんが、構文にも問題があります。それでどちらかの提案が評価されます。

> df$3rd <- ddply(df, .(1st), function(x) x$3rd <- 
> mapply(myfunction, A=x$1st, B=df$second)) 

をし、これは私が取得していますエラーです:

この

は私がしようとしているものです

Error in `$<-.data.frame`(`*tmp*`, "n", value = c(1L, 1L, 1L, 1L, 1L, : 
    replacement has 112 rows, data has 16 

EDIT:の光で



回答とコメント私は小さな再現可能なexaを掲示していますそれは前の質問からの答えの一つです。しかし、注釈の注釈者のように、ddplyはおそらく行く方法ではありません。私は今Ramnathの解決策を試しています。

library(reshape2) 
foo <- data.frame(x = c('a', 'a', 'a', 'b', 'b', 'b'), 
        y = c('ab', 'ac', 'ad', 'ae', 'fx', 'fy')) 
bar <- data.frame(x = c('c', 'c', 'c', 'd', 'd', 'd'), 
        y = c('ab', 'xy', 'xz', 'xy', 'fx', 'xz')) 

nShared <- function(A, B) { 
    length(intersect(with(foo, y[x==A]), with(bar, y[x==B]))) 
} 

# Enumerate all combinations of groups in foo and bar 
(combos <- expand.grid(foo.x=unique(foo$x), bar.x=unique(bar$x))) 

# Find number of elements in common among all pairs of groups 
combos$n <- mapply(nShared, A=combos$foo.x, B=combos$bar.x) 

# Reshape results into matrix form 
dcast(combos, foo.x ~ bar.x) 
# foo.x c d 
# 1  a 1 0 
# 2  b 0 1 
+2

一般に、plyr関数は便宜上(便利な構文)であり、適用ファミリは通常、時間が懸念されるときによく機能します。小さな再現可能な例を提供するように注意しますか? –

+1

@ zach。あなたの以前の質問に私の解決策をチェックしてください。 'mapply'と' expand.grid'を使う必要がなくなりました – Ramnath

答えて

4

ddplyはあなたがここに後にしているものではありません、ddply(df,.(1st), FUNCTION)は、より多くのようなものです:

ある
for each val in unique(df$1st) 
    outdf[nrow(outdf)+1,] = FUNCTION(df[df$1st==val]) 

は、それが列1stによって決定dfのサブセットに適用されるFUNCTIONからなるoutdfになります。いずれの場合においても

は、私はあなたが(B引数)function(x) x$3rd<-mapply(myfunction,A=x$1st, B=df$second)df代わりのxを持っているので、あなたの誤差があるかもしれないと思いますか?実際の例がなければ伝えるのは難しいですが。

正確にはmyfunctionとは何ですか?私はあなたの最高の賭けはベクトル化myfunctionになると思うので、ちょうどdf$third <- myfunction(A=df$first, B=df$second)をすることができます。

たとえば、myfunction <- function(A,B) { A+B }の場合は、mapply(myfunction,df$first,df$second)の代わりにmyfunction(df$first,df$second)を入力することもできます。まったくマッチする必要はありません。

+0

thanks @ mathematical.coffee。私はあなたが正しいと思う - それはddplyはパフォーマンスの向上をもたらさないだろうし、私の機能をベクトル化することは良いアイデアだろう。しかし、私の関数は2つの他のデータフレームの値を検索する役割を果たします。上記の質問とそれ以前の質問を参照してください。ベクトル化はできません。私は、Pythonで自分のデータを処理し、結果のテーブルを分析するためにRを使うという私のpre-R戦略に戻ると思います。 – zach

+0

@ Zach。 [前の質問](http://stackoverflow.com/questions/8749589/create-a-scoring-matrix-from-two-dataframes)のコメントでは、[data.table](http:// datatable。 r-forge.r-project.org/)。これもこれでも使えますか? –

+0

@MatthewDowle。このケースではうまくいくかもしれませんが、data.tableはその必要性を取り除きます。この質問は、前の質問の解決策の1つで遭遇する問題を明確にすることを目的としていました。 Ramnathのdata.tableソリューションは十分速く、メモリの消費も少ないので、私は彼のソリューションを直接使用でき、この質問について心配する必要はありません。複数の引数をdata.tableに渡すことができないのかどうか疑問に思っているのですが、私は確信していますが、連続関数を渡すことは間違いありません。また、data.tableはdata.frameとは異なる動作をします。正しい結果が得られるまで、結果を注意深くチェックしてください。 – zach

関連する問題