Мы могли бы использовать 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()
и упаковываем результат в матрицу с правильными именами.
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))