답변:
패키지 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
패키지 아닌가요? :)