2011-12-19 5 views
1

나는 다음과 같은 데이터 집합을 가지고 있습니다.R - 열 하위 집합 간의 상관 관계 - 현재 행의 참조

 name  Exp1Res1 Exp1Res2 Exp1Res3 ExpRes1 Exp2Res2 Exp3Res3 

[1]  ID1   5   7   9   7   9  2 

[2]  ID2   6   4   2   9   5  1 

[3]  ID3   4   9   9   9   11  2 

각 행에 대해 실험 1과 2 간의 상호 관계를 결정해야합니다. 내 데이터 세트 (FullSet)에 실제로 37 개의 열과 100,000 개의 행이 있으므로 루핑의 원래 솔루션은 너무 느립니다 (아래 참조). 그래서 최적화하고 싶었습니다.

내 원래 솔루션은;

df <- data.frame(matrix(ncol = 5, nrow = dim(FullSet)[1])) 
names(df)<-c("ID","pearson","spearman") 
for (i in seq(1, dim(FullSet)[1])) 
{ 
    pears=cor(as.numeric(t(FullSet[i,2:19])),as.numeric(t(FullSet[i,20:37])), method="pearson") 
    spear=cor(as.numeric(t(FullSet[i,2:19])),as.numeric(t(FullSet[i,20:37])), method="pearson") 
    df[i,]<-c(FullSet[i,1],pears,spear) 
} 

나는 이것이 작동해야한다고 느낍니다.

FullSet$pearson<-cor(as.numeric(t(FullSet[,2:19])),as.numeric(t(FullSet[,20:37])), method="pearson") 

하지만 난 어떻게 전치 단지 현재의 행을 참조하는/알고하지 않습니다 -

t(FullSet[,2:19]) - which should read something like t(FullSet[<currow>,2:19]). 

도움을 주시면 감사하겠습니다 - 내 접근도 정확한지 모르겠다.

출력 (결과가 정확하지 않습니다 - 예를 들어 만)과 같아야합니다

 name  Pearson  Spearman 

[1]  ID1   0.8   .75 

[2]  ID2   0.9   .8 

[3]  ID3   0.85   .7 

답변

4

어떤 형식으로 선보이고 : reshape를 사용하여

ID EXP Res 
1 1 . 
1 1 . 
1 2 . 
1 2 . 

다음 작업을 할 plyr셔서 :

require(plyr) 
ddply(df, .(ID, EXP), summarize, cor(...)) 

가능성이 있습니까? 당신이 스피어맨과 페어슨을 위해 별도로해야한다면 말입니다.

+0

나는 이것을 대답으로 표시 했으므로 대안이있다. (단지 녹아서 부드럽게된다.) 그러나 루프 방법보다 빠르다. – statler

관련 문제