2016-11-22 139 views
1

相關運算我需要計算基於兩個條件我的數據集的相關性。下面是一個例子:R:基於兩個條件

df1 <- data.frame(
    Main = c(0.0089, -0.050667, -0.030379, 0.066484, 0.006439, -0.026076), 
    B = c(NA, 0.0345, -0.0683, -0.052774, 0.014661, -0.040537), 
    C = c(0.0181, 0, -0.056197, 0.040794, 0.03516, -0.022662), 
    D = c(-0.0127, -0.025995, -0.04293, 0.057816, 0.033458, -0.058382) 
) 
df1 
# Main  B   C   D 
# 1 0.008900 NA   0.018100 -0.012700 
# 2 -0.050667 0.034500 0.000000 -0.025995 
# 3 -0.030379 -0.068300 -0.056197 -0.042930 
# 4 0.066484 -0.052774 0.040794 0.057816 
# 5 0.006439 0.014661 0.035160 0.033458 
# 6 -0.026076 -0.040537 -0.022662 -0.058382 

我想Main和每一列之間的相關性1)Main<0和2)1)滿足時的時候,列BCD不等於0。在這個例子中,用於主和B,行#2,3 & 6(DF1)適合的規則;對於Main和C,行#3 & 6合適;用於主和d,行#2,3 & 6配合。

在Excel中,這可以通過使用兩個if函數來完成。例如,計算MainB之間的負相關關係,我可以用{=CORREL(IF(A1:A6<0, A1:A6), IF(A1:A6<0, IF(B1:B6<>0, B1:B6)))}

我的實際數據集有近20列這樣和將隨着時間而改變。我非常確定R可以做到這一點,但我一直堅持這個問題幾個小時。任何建議將被認真考慮。

+0

你要什麼用'NA'做了什麼? – MichaelChirico

+0

@MichaelChirico我想刪除NAs。 –

+0

然後下面的代碼,甚至更好,因爲'[.data.table'自動排除從子集'NA'元件。 – MichaelChirico

回答

2
a=as.matrix(df1) 
ind=(a[,1]<0) 
a[a==0]=NA 
cor(a[ind,1],a[ind,-1],use="pairwise") 
0

使用data.table

library(data.table) 
setDT(df1) 
df1[Main < 0 & Reduce(`&`, lapply(df1[ , !"Main", with = FALSE], `!=`, 0)), 
    cor(.SD)] 
#  Main B C D 
# Main 1 1 1 -1 
# B  1 1 1 -1 
# C  1 1 1 -1 
# D  -1 -1 -1 1 

(顯然,因爲該子集只有兩個點,一切都完全相關 - 兩個點定義一個唯一的線)

如果install the development version of data.table,這可以稍微簡化爲:

df1[Main < 0 & Reduce(`&`, lapply(df1[ , !"Main"], `!=`, 0)), 
    cor(.SD)] 
+0

感謝您的回答。但是,結果似乎沒有了。 Main與B,C和D的負相關分別爲-0.90953,1.0和-0.9452。 –

+0

@ T-T只有第4和5行適合您的情況。你在哪裏得到這些數字? – MichaelChirico

+0

我通過使用我在文章中提到的公式獲得了他們的Excel。對於Main和B,行#2,3和6(df1)適合;對於Main和C,第3行和第6行適合;對於Main和D,第2,3和6行適合。 –