您需要迭代。例如,此方法为您提供 p 值矩阵,类似于 cor 为您提供每个列-列组合的相关值。
myfunc <- function(i,j) mapply(function(a,b) cor.test(mtcars[[a]], mtcars[[b]])$p.value, i, j)
mt <- mtcars[1:5]
outer(seq_len(ncol(mt)), seq_len(ncol(mt)), myfunc)
# [,1] [,2] [,3] [,4] [,5]
# [1,] 0.000000e+00 6.112687e-10 9.380327e-10 1.787835e-07 1.776240e-05
# [2,] 6.112687e-10 0.000000e+00 1.802838e-12 3.477861e-09 8.244636e-06
# [3,] 9.380327e-10 1.802838e-12 0.000000e+00 7.142679e-08 5.282022e-06
# [4,] 1.787835e-07 3.477861e-09 7.142679e-08 0.000000e+00 9.988772e-03
# [5,] 1.776240e-05 8.244636e-06 5.282022e-06 9.988772e-03 0.000000e+00
甚至更好,有名字(感谢@RyanD):
outer(mt, mt, Vectorize(function(a, b) cor.test(a, b)$p.value))
# mpg cyl disp hp drat
# mpg 0.000000e+00 6.112687e-10 9.380327e-10 1.787835e-07 1.776240e-05
# cyl 6.112687e-10 0.000000e+00 1.802838e-12 3.477861e-09 8.244636e-06
# disp 9.380327e-10 1.802838e-12 0.000000e+00 7.142679e-08 5.282022e-06
# hp 1.787835e-07 3.477861e-09 7.142679e-08 0.000000e+00 9.988772e-03
# drat 1.776240e-05 8.244636e-06 5.282022e-06 9.988772e-03 0.000000e+00
如果您只需要将一列与所有其他列进行比较,那么:
outer(1, seq_len(ncol(mt)), myfunc)
# [,1] [,2] [,3] [,4] [,5]
# [1,] 0 6.112687e-10 9.380327e-10 1.787835e-07 1.77624e-05
outer(mt[1], mt, Vectorize(function(a, b) cor.test(a, b)$p.value))
# mpg cyl disp hp drat
# mpg 0 6.112687e-10 9.380327e-10 1.787835e-07 1.77624e-05
...但是将其作为data.frame 中的一列应用是没有意义的:添加一列表明(例如)第一个返回的 p 值将与第一行中的其他值相关联,绝对不是这样的。