我需要根据两个条件计算数据集的相关性。以下是一个例子:
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),列B
,C
,或D
不等于0
。在这个例子中,对于Main和B,行#2,3和&amp; 6(df1)符合规则;对于Main和C,第3行和第3行6适合;对于Main和D,第2,3行和第3行6适合。
在Excel中,可以使用两个if
函数来完成此操作。例如,要计算Main
和B
之间的负相关,我可以使用{=CORREL(IF(A1:A6<0, A1:A6), IF(A1:A6<0, IF(B1:B6<>0, B1:B6)))}
我的实际数据集接近20列,并且会不时更改。我很确定R可以做到这一点,但我已经坚持了几个小时这个问题。任何建议将不胜感激。
答案 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)]