假设我有一个函数,它接受两个向量并返回一个整数,例如一个向量中也存在另一个向量中的元素数量。喜欢:
f <- function(v1,v2)sum(v1 %in% v2)
如何将该函数应用于 n*m 矩阵中 m 列的所有成对组合。
set.seed(1)
m <- replicate(3, sample(letters[1:10], size = 5))
dimnames(m) <- list(NULL, paste0('c', 1:ncol(m)))
现在,
> m
[,1] [,2] [,3]
[1,] "c" "i" "c"
[2,] "d" "j" "b"
[3,] "e" "f" "f"
[4,] "g" "e" "j"
[5,] "b" "a" "e"
并在前两列上取函数:
> f(m[,1], m[,2])
[1] 1 #'e' is shared.
如何对所有列组合执行此操作?结果可能是一个 m*m 矩阵(其中结果围绕对角线对称),或者,它可能是一个长格式数据框,其中包含 v1、v2 和函数结果的列(例如,第一行将是 c1
、c2
和 3
)
我尝试研究函数 outer
和 expand.grid
但找不到解决方案。
最佳答案
sapply(1:3, function(i) sapply(1:3, function(j) f(m[,i], m[,j])))
# [,1] [,2] [,3]
#[1,] 5 1 3
#[2,] 1 5 3
#[3,] 3 3 5
或者以下输出可能更友好
sapply(data.frame(m), function(x1) sapply(data.frame(m), function(x2) f(x1, x2)))
# c1 c2 c3
#c1 5 1 3
#c2 1 5 3
#c3 3 3 5
关于r - 对 n*m 矩阵的所有列组合进行函数运算,生成 m*m 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44709440/