R : 그룹 별 상관 관계 계산


17

R에는 클래스 레이블 C (인수)와 두 개의 측정치 M1M2로 구성된 데이터 프레임이 있습니다. 각 클래스 내에서 M1M2 간의 상관 관계를 어떻게 계산 합니까?

이상적으로는 각 클래스에 대해 하나의 행과 클래스 레이블 C 및 상관 관계 의 두 개의 열이있는 데이터 프레임을 다시 얻습니다 .

답변:


20

패키지 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

1
(+1) 멋진 plyr패키지 아닌가요? :)
chl

이것은 잘 작동합니다. plyr 패키지를 지적 해 주셔서 감사합니다! ". (group)"구문을 설명해 주시겠습니까?
NPE

2
aix-확실합니다. ". () 사이의 변수로 데이터를 분할하고 각 하위 집합에서 함수를 수행합니다"를 의미합니다. 더 많은 변수를 포함 시키려면. (var1, var2, var3) 구문을 사용해야합니다. 이는 var1, var2 및 var3 수준의 각 조합으로 데이터를 자르는 것과 같습니다. 그리고 각 컷에서 기능을 수행하십시오. 이 패키지는 Hadley (ggplot2의 저자)가 관리하므로 계속 개발할 것이라고 믿습니다.
탈 Galili

2
아, 그리고 BTW, 당신은 또한 (거의 자동으로) 여러 코어에서 병렬 컴퓨팅으로 plyr를 사용할 수 있습니다. r-statistics.com/2010/09/…
Tal Galili

1
좋은 답변이지만, 이것에 대한 내장 솔루션이 없다는 것에 놀랐습니다. cor (x, y, by = z)와 같은 것은 매우 직관적입니다 ...
Waldir Leoncio

12

기본 패키지에서 함수를 사용하려는 경우 함수를 사용한 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)

1
감사합니다! 나는 실험 by했지만 결과를 데이터 프레임으로 변환하는 방법을 알 수 없었습니다.
NPE

9

기본 패키지 및 Tal의 예제 데이터를 사용하는 또 다른 예 :

DataCov <- do.call( rbind, lapply( split(xx, xx$group),
             function(x) data.frame(group=x$group[1], mCov=cov(x$a, x$b)) ) )

우아한 솔루션 Joshue. 하나의 솔루션이 다른 솔루션보다 나은 경우가 있다고 생각하십니까?
Tal Galili

2
나는 그것이 선호의 문제라고 생각합니다. 내 예제는 본질적으로 무엇 plyr이지만, 그것은 거의 깨끗하지는 않지만 더 세밀한 제어를 제공합니다. 하나의 솔루션에 더 나은 시간 / 메모리 프로파일이 있으면 내 의견이 바뀔 것입니다. 나는 그들을 비교하지 않았습니다.
Joshua Ulrich

이것이 어떻게 상관 관계를 반환합니까?

2

data.table을 사용하는 것이 dplyr보다 짧습니다.

dt <- data.table(xx)
dtCor <- dt[, .(mCor = cor(M1,M2)), by=C]

0

다음은 각 상관 관계에 대한 n 및 p 값이있는 표를 제공하는 유사한 방법입니다 (편의상 소수점 이하 3 자리로 반올림).

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))))
}

0

다음을 사용하여보다 현대적인 솔루션이 있습니다. 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.