R:基于两个条件的相关计算

时间:2016-11-22 22:29:40

标签: 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),列BC,或D不等于0。在这个例子中,对于Main和B,行#2,3和&amp; 6(df1)符合规则;对于Main和C,第3行和第3行6适合;对于Main和D,第2,3行和第3行6适合。

在Excel中,可以使用两个if函数来完成此操作。例如,要计算MainB之间的负相关,我可以使用{=CORREL(IF(A1:A6<0, A1:A6), IF(A1:A6<0, IF(B1:B6<>0, B1:B6)))}

我的实际数据集接近20列,并且会不时更改。我很确定R可以做到这一点,但我已经坚持了几个小时这个问题。任何建议将不胜感激。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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)]