我有这样的数据集
set.seed(1)
a = abs(rnorm(10, mean = 0, sd= 1))
b = abs(rnorm(10, mean = 0, sd= 1))
c = abs(rnorm(10, mean = 0, sd= 1))
d = abs(rnorm(10, mean = 0, sd= 1))
df = as.data.frame(cbind(a, b, c, d))
我想要一张桌子
c d
a 0.5 0.1
b 0.8 0.3
其中cols和rows是变量和单元格 - 变量之间的相关系数。
我做如下
for(j in df[, 1:2]) {
for(i in df[, 3:4]) {
k=abs(cor.test(j, i, method = c( "spearman"))$estimate)
cat(k, '\n')
y <- rbind(y, k)
}}
y
并获取
rho
k 0.175757576
k 0.006060606
k 0.151515152
k 0.054545455
我使用了这篇文章Using double loop to fill a matrix in R
mat<-matrix(list(c(NA,NA)), nrow=2, ncol=2)
for(j in df[, 1:2]) {
for(i in df[, 3:4]) {
mat[i,j][[1]]=abs(cor.test(j, i, method = c( "spearman"))$estimate)
}}
mat
我得到了
[,1] [,2]
[1,] Logical,2 Logical,2
[2,] Logical,2 Logical,2
如何填表?或者我可以不循环填充它吗?
ggpairs
等工具答案 0 :(得分:2)
我会计算df
一次的相关矩阵,然后根据需要对我需要的任何组合进行子集化。这样,您就不必多次运行cor
。
m = cor(df, method = "spearman")
m[row.names(m) %in% c("a","b"), colnames(m) %in% c("c","d")]
# c d
#a 0.05454545 -0.40606061
#b 0.75757576 0.05454545
答案 1 :(得分:1)
函数cor()
可以做到:
set.seed(1)
a = abs(rnorm(10, mean = 0, sd= 1))
b = abs(rnorm(10, mean = 0, sd= 1))
c = abs(rnorm(10, mean = 0, sd= 1))
d = abs(rnorm(10, mean = 0, sd= 1))
#### df = as.data.frame(cbind(a, b, c, d)) # not used
cor(cbind(a,b), cbind(c,d))
# > cor(cbind(a,b), cbind(c,d))
# c d
# a 0.5516642 -0.3918783
# b 0.8200195 0.1474773
您可以abs()
获得所需的结果:
abs(cor(cbind(a,b), cbind(c,d)))
# > abs(cor(cbind(a,b), cbind(c,d)))
# c d
# a 0.5516642 0.3918783
# b 0.8200195 0.1474773
斯皮尔曼:
abs(cor(cbind(a,b), cbind(c,d), method = "spearman"))
# > abs(cor(cbind(a,b), cbind(c,d), method = "spearman"))
# c d
# a 0.05454545 0.40606061
# b 0.75757576 0.05454545
如果您想使用数据框,可以执行以下操作:
df = as.data.frame(cbind(a, b, c, d))
rm(a,b,c,d) ### to be sure that a, ..., d are from the dataframe.
with(df, abs(cor(cbind(a,b), cbind(c,d), method = "spearman")))
或
abs(cor(df[,c("a", "b")], df[,c("c","d")], method = "spearman"))