Câu trả lời:
Gói plyr là con đường để đi.
Đây là một giải pháp đơn giản:
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)
Đầu ra sẽ là:
group COR
1 1 0.05152923
2 2 -0.15066838
3 3 -0.04717481
4 4 0.07899114
Nếu bạn có xu hướng sử dụng các chức năng trong gói cơ sở, bạn có thể sử dụng by
chức năng đó, sau đó lắp lại dữ liệu:
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
, nhưng không thể tìm ra cách chuyển đổi kết quả thành khung dữ liệu.
Một ví dụ khác sử dụng các gói cơ sở và dữ liệu ví dụ của 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
làm nhưng nó mang lại cho bạn sự kiểm soát tốt hơn, mặc dù nó gần như không sạch sẽ. Ý kiến của tôi sẽ thay đổi nếu một giải pháp có hồ sơ thời gian / bộ nhớ tốt hơn. Tôi đã không so sánh họ mặc dù.
Đây là một phương pháp tương tự sẽ cung cấp cho bạn một bảng có các giá trị n và p cho mỗi tương quan (làm tròn đến 3 chữ số thập phân để thuận tiện):
library(Hmisc)
corrByGroup <- function(xx){
return(data.frame(cbind(correl = round(rcorr(xx$a, xx$b)$r[1,2], digits=3),
n = rcorr(xx$a, xx$b)$n[1,2],
pvalue = round(rcorr(xx$a, xx$b)$P[1,2], digits=3))))
}
Đây là một giải pháp hiện đại hơn, sử dụng dplyr
gói (chưa tồn tại khi câu hỏi được hỏi):
Xây dựng đầu vào:
xx <- data.frame(group = rep(1:4, 100), a = rnorm(400) , b = rnorm(400) )
Tính toán các mối tương quan:
library(dplyr)
xx %>%
group_by(group) %>%
summarize(COR=cor(a,b))
Đầu ra:
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
Gói đẹp phải không? :)