2013-08-30 30 views
10

我有一組大dataframes看起來像A和B的:計算兩個數據幀之間的相關性是否需要循環?

A <- data.frame(A1=c(1,2,3,4,5),B1=c(6,7,8,9,10),C1=c(11,12,13,14,15)) 

    A1 B1 C1 
1 1 6 11 
2 2 7 12 
3 3 8 13 
4 4 9 14 
5 5 10 15 

B <- data.frame(A2=c(6,7,7,10,11),B2=c(2,1,3,8,11),C2=c(1,5,16,7,8)) 

    A2 B2 C2 
1 6 2 1 
2 7 1 5 
3 7 3 16 
4 10 8 7 
5 11 11 8 

我想創建矢量(C),其表示A1 & A2之間的Pearson相關性,B1 & B2和C1 & C2。在這種情況下,例如,那些相關性是:

[1] 0.95 0.92 0.46 

回答

13

cor接受兩個data.frames:

A<-data.frame(A1=c(1,2,3,4,5),B1=c(6,7,8,9,10),C1=c(11,12,13,14,15)) 

B<-data.frame(A2=c(6,7,7,10,11),B2=c(2,1,3,8,11),C2=c(1,5,16,7,8)) 

cor(A,B) 

#   A2  B2  C2 
# A1 0.9481224 0.9190183 0.459588 
# B1 0.9481224 0.9190183 0.459588 
# C1 0.9481224 0.9190183 0.459588 

diag(cor(A,B)) 
#[1] 0.9481224 0.9190183 0.4595880 

編輯:

下面是一些基準:

Unit: microseconds 
        expr  min  lq median  uq  max neval 
     diag(cor(A, B)) 230.292 238.4225 243.0115 255.0295 352.955 100 
     mapply(cor, A, B) 267.076 281.5120 286.8030 299.5260 375.087 100 
unlist(Map(cor, A, B)) 250.053 259.1045 264.5635 275.9035 1146.140 100 

Ed IT2:

而且一些更好的基準使用

set.seed(42) 
A <- as.data.frame(matrix(rnorm(10*n),ncol=n)) 
B <- as.data.frame(matrix(rnorm(10*n),ncol=n)) 

enter image description here

不過,我也許應該提到的是,這些基準很大程度上取決於行數。

編輯3:由於我被要求基準代碼,在這裏。

b <- sapply(2^(1:12), function(n) { 
    set.seed(42) 
    A <- as.data.frame(matrix(rnorm(10*n),ncol=n)) 
    B <- as.data.frame(matrix(rnorm(10*n),ncol=n)) 

    require(microbenchmark) 
    res <- print(microbenchmark(
        diag(cor(A,B)), 
        mapply(cor, A, B), 
        unlist(Map(cor,A,B)), 
        times=10 
       ),unit="us") 
    res$median 
}) 

b <- t(b) 

matplot(x=1:12,log10(b),type="l", 
     ylab="log10(median [µs])", 
     xlab="log2(n)",col=1:3,lty=1) 
legend("topleft", legend=c("diag(cor(A, B))", 
          "mapply(cor, A, B)", 
          "unlist(Map(cor,A,B))"),lty=1, col=1:3) 
+4

+'diag'只能得到他感興趣的值。 – sgibb

+0

謝謝,我剛剛準備編輯。 – Roland

+0

是否有與'cor'類似的函數來給出相關性的p值? – dayne

7

您可以使用應用功能的朋友Map

Map(function(x,y) cor(x,y),A,B) 
$A1 
[1] 0.9481224 

$B1 
[1] 0.9190183 

$C1 
[1] 0.459588 

如果你想輸出爲載體的建議通過@Jilber:

unlist(Map(function(x,y) cor(x,y),A,B)) 
     A1  B1  C1 
0.9481224 0.9190183 0.4595880 

或者,你可以使用:

unlist(Map(cor,A,B)) 
     A1  B1  C1 
0.9481224 0.9190183 0.459588 
+1

由於OP想要一個向量,所以應該使用'unlist(·)'。 –

+0

謝謝。我會更新它。 – Metrics

+0

對於Map的一個很好的例子,+1,我仍然沒有在R中用這些函數式編程概念來包裝我的頭。 –

6

另一種選擇,你可以使用mapply功能

> mapply(function(x,y) cor(x,y),A,B) 
     A1  B1  C1 
0.9481224 0.9190183 0.4595880 

或者理由如@Aaron所建議的那樣t mapply(cor, A, B)

+3

雖然'mapply(cor,A,B)'就足夠了,這就是我要做的。 – Aaron

+0

@Aaron如何將這種想法應用於需要相互關聯的文件列表?說A .... Z? – KennyC

+0

@KennyC:我覺得更好的是開始一個新的問題;需要更多細節。 – Aaron

相關問題