Answers:
打包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
做什么的,但是它虽然没有那么干净,但可以为您提供更好的控制。如果一种解决方案具有更好的时间/内存配置文件,我的看法将会改变。我还没有比较它们。
这是一个使用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
包裹,不是吗?:)