ノート内:これは、直接この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
一般に、plyr関数は便宜上(便利な構文)であり、適用ファミリは通常、時間が懸念されるときによく機能します。小さな再現可能な例を提供するように注意しますか? –
@ zach。あなたの以前の質問に私の解決策をチェックしてください。 'mapply'と' expand.grid'を使う必要がなくなりました – Ramnath