我的数据是由59个变量(列)和500个观测(每个参与者)的。我必须做出一个项目(列)与项目的其余部分(所有其他列)的相关性。
我在此为第一列到别人,但我想重复操作在for循环中。
我试过了 :
sapply(mydata[-1],function(y)cor.test(mydata$First_Item,y)$p.value)
但是,如果我会为一号塔与其他3:59第二列做到这一点,这是行不通的。
我想这样的事情:
for (i in 1:59){
sapply(mydata[,i],function(y)cor.test(mydata[,i],y)$p.value)
}
非常感谢!
编辑:
B1_TP_CO_9999_01 = c(1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1)
B1_TP_CO_9999_02 = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
B1_TP_CO_9999_03 = c(2, 0, 0, 2, 2, 2, 2, 2, 0, 1, 0, 2, 2, 2, 0)
B1_TP_CO_9999_04 = c(0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0)
B1_TP_CO_9999_05 = c(0, 2, 2, 2, 0, 0, 2, 2, 0, 0.5, 0, 0, 2, 1, 0)
该?cor
功能将创建相关矩阵不错快捷。但是,如果你想有一个自定义的功能,如使p值容易,仅仅尝试了双回路。不是最快的,但很简单。
mydata <- matrix(runif(200),20,10)
p <- ncol(mydata)
cor_pval <- function(x, y) cor.test(x, y)$p.value
m <- matrix(0, p, p)
for (i in 1:ncol(mydata)) {
for (j in 1:ncol(mydata)) {
m[i,j] = cor_pval(mydata[,i], mydata[,j])
}
}
这是相当强力。你不需要的功能,如果你不想要它,但它可以很容易地改变度量。此外,而不是做在第二循环中的每一列,你可以从j
开始i+1
以便不重复计算。但是,这应该让你的结果,你可以从那里调为你找出循环。
另外这里它与应用功能,你在干什么。如果你要建立的结果早在矩阵,您需要在0到时隙从i=j
环矢量for
的位置。
m2 <- matrix(0, p, p)
for (i in 1:p) {
m2[i, ] = append(apply(mydata[,-i], 2, cor_pval, y = mydata[,i]), 0, after = i - 1)
}
all.equal(m, m2)
[1] TRUE
我们可以使用expand.grid()
避免嵌套循环。
n <- ncol(mydata)
ex <- t(expand.grid(1:n, 1:n)) # transpose with `t()`
myCor <- function(x) cor.test(x[, 1], x[, 2])$p.value # test fun
现在我们运行一个单一sapply()
和结果包装与右dimnames的矩阵。
MX <- matrix(sapply(seq(ncol(ex)), function(i) myCor(mydata[ex[, i]])),
ncol=n, dimnames=rep(list(names(mydata)), 2))
产量:
MX <- round(MX, 3)
> MX
B1_TP_CO_9999_01 B1_TP_CO_9999_02 B1_TP_CO_9999_03 B1_TP_CO_9999_04 B1_TP_CO_9999_05
B1_TP_CO_9999_01 0.000 NA 0.043 1.000 0.757
B1_TP_CO_9999_02 NA NA NA NA NA
B1_TP_CO_9999_03 0.043 NA 0.000 0.857 0.703
B1_TP_CO_9999_04 1.000 NA 0.857 0.000 0.164
B1_TP_CO_9999_05 0.757 NA 0.703 0.164 0.000
测试告诉我们,这是工作:
> cor.test(mydata[, 1], mydata[, 3])$p.value
[1] 0.04325627
> cor.test(mydata[, 4], mydata[, 3])$p.value
[1] 0.8574056
> cor.test(mydata[, 4], mydata[, 5])$p.value
[1] 0.164388
如果我们想摆脱上三角形的我们终于可以做
MX[upper.tri(MX, diag=TRUE)] <- ""
导致:
> as.data.frame(MX)[-n]
B1_TP_CO_9999_01 B1_TP_CO_9999_02 B1_TP_CO_9999_03 B1_TP_CO_9999_04
B1_TP_CO_9999_01
B1_TP_CO_9999_02 <NA>
B1_TP_CO_9999_03 0.043 <NA>
B1_TP_CO_9999_04 1 <NA> 0.857
B1_TP_CO_9999_05 0.757 <NA> 0.703 0.164
注:警告,从您的数据干,你可以或者例如测试代码与mydata <- iris[-5]
。
数据
mydata <- structure(list(B1_TP_CO_9999_01 = c(1, 0, 0, 0, 0, 1, 1, 1, 0,
1, 0, 1, 1, 1, 1), B1_TP_CO_9999_02 = c(1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1), B1_TP_CO_9999_03 = c(2, 0, 0, 2, 2,
2, 2, 2, 0, 1, 0, 2, 2, 2, 0), B1_TP_CO_9999_04 = c(0, 1, 1,
0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0), B1_TP_CO_9999_05 = c(0,
2, 2, 2, 0, 0, 2, 2, 0, 0.5, 0, 0, 2, 1, 0)), class = "data.frame", row.names = c(NA,
-15L))