r - 对 n*m 矩阵的所有列组合进行函数运算,生成 m*m 结果

标签 r function matrix combinations

假设我有一个函数,它接受两个向量并返回一个整数,例如一个向量中也存在另一个向量中的元素数量。喜欢:

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 和函数结果的列(例如,第一行将是 c1c23 )

我尝试研究函数 outerexpand.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/

相关文章:

R - 通过光栅图像(迷宫)寻找成本最低的路径?

r - 将多个片段匹配到多个字符较长的地方

r - 在 R 包中使用静态(预构建)PDF 小插图

python - 随机矩阵,各列值的总和不大于 1

r - 需要在 ggplot2 中使用 viridis 进行特定着色

c - 在 C 中查找范围

javascript - 删除答案并重新开始 JS 计算器

python - Gnuplot:使用函数转换数据文件的列并绘制转换后的数据和函数

c++ - CUDA 中的固定大小 SVD 和求解器(在设备中)

c - 你如何使用 cblas_dgemm 做一个 vector 外积?