回答:
パッケージplyrがその方法です。
簡単な解決策は次のとおりです。
xx <- data.frame(group = rep(1:4, 100), a = rnorm(400) , b = rnorm(400) )
head(xx)
require(plyr)
func <- function(xx)
{
return(data.frame(COR = cor(xx$a, xx$b)))
}
ddply(xx, .(group), func)
出力は次のようになります。
group COR
1 1 0.05152923
2 2 -0.15066838
3 3 -0.04717481
4 4 0.07899114
基本パッケージで関数を使用する場合は、関数を使用してからby
データを再構築できます。
xx <- data.frame(group = rep(1:4, 100), a = rnorm(400) , b = rnorm(400) )
head(xx)
# This returns a "by" object
result <- by(xx[,2:3], xx$group, function(x) {cor(x$a, x$b)})
# You get pretty close to what you want if you coerce it into a data frame via a matrix
result.dataframe <- as.data.frame(as.matrix(result))
# Add the group column from the row names
result.dataframe$C <- rownames(result)
by
、結果をデータフレームに変換する方法がわかりませんでした。
基本パッケージとTalのサンプルデータを使用した別の例:
DataCov <- do.call( rbind, lapply( split(xx, xx$group),
function(x) data.frame(group=x$group[1], mCov=cov(x$a, x$b)) ) )
plyr
が、それはあなたがより細かく制御することができますが、それほどきれいではありません。1つのソリューションの時間/メモリプロファイルが改善された場合、私の意見は変わります。私はそれらを比較していません。
dplyr
パッケージを使用した、より現代的なソリューションを次に示します(質問が行われた時点ではまだ存在していませんでした)。
入力を作成します。
xx <- data.frame(group = rep(1:4, 100), a = rnorm(400) , b = rnorm(400) )
相関を計算します。
library(dplyr)
xx %>%
group_by(group) %>%
summarize(COR=cor(a,b))
出力:
Source: local data frame [4 x 2]
group COR
(int) (dbl)
1 1 0.05112400
2 2 0.14203033
3 3 -0.02334135
4 4 0.10626273
plyr
パッケージですね。:)