文本矩阵乘法

Text Matrix multiplication

这是我的两个文本矩阵:

A <- matrix(c("AIP-A","CSV-A"), ncol = 1, byrow = TRUE)
B <- matrix(c("AIP-B","CSV-B"), ncol = 1, byrow = TRUE)

我正在尝试计算这些矩阵的乘积,输出应如下所示:

AIP-A,AIP-B
AIP-A,CSV-B
CSV-A,AIP-B
CSV-A,CSV-B

A*B 不起作用,因为它正在寻找数字输入。也许通过其他一些技术可以获得相同的结果。 我可以使用 4x2 输出矩阵、一个 4x1 矩阵、一个字符向量、data.frame 和 data.table

不确定你对 "multiplication" 的定义,但使用 cbindrep 你会得到这个:

> cbind(rep(A,each=nrow(B)),rep(B,nrow(A)))
     [,1]    [,2]   
[1,] "AIP-A" "AIP-B"
[2,] "AIP-A" "CSV-B"
[3,] "CSV-A" "AIP-B"
[4,] "CSV-A" "CSV-B"

此方法使用 expand.gridReducepaste:

Reduce(function(...) paste(..., sep=","), expand.grid(A,B))
[1] "AIP-A,AIP-B" "CSV-A,AIP-B" "AIP-A,CSV-B" "CSV-A,CSV-B"

您可以使用 outer 作为数组与 paste 的外积以获得您想要的输出:

c(outer(A, B, paste, sep = ","))
# [1] "AIP-A,AIP-B" "CSV-A,AIP-B" "AIP-A,CSV-B" "CSV-A,CSV-B"

matrix(outer(A, B, paste, sep = ","), ncol = 1)
#     [,1]         
#[1,] "AIP-A,AIP-B"
#[2,] "CSV-A,AIP-B"
#[3,] "AIP-A,CSV-B"
#[4,] "CSV-A,CSV-B"

这是一个使用 data.table

中的 CJ 的选项
library(data.table)
CJ(A[,1], B[,1])[, paste(V1, V2, sep=", ")]
#[1] "AIP-A, AIP-B" "AIP-A, CSV-B" "CSV-A, AIP-B" "CSV-A, CSV-B"

matrix 包裹它以创建单列 matrix

 matrix(CJ(A[,1], B[,1])[, paste(V1, V2, sep=", ")])
 #   [,1]          
 #[1,] "AIP-A, AIP-B"
 #[2,] "AIP-A, CSV-B"
 #[3,] "CSV-A, AIP-B"
 #[4,] "CSV-A, CSV-B"

或使用dplyr/tidyr

 library(dplyr)
 library(tidyr)
 data_frame(A=A[,1], B=B[,1]) %>% 
         complete(A,B) %>% 
          unite(AB, A,B)
 #          AB
 #        <chr>
 #1 AIP-A_AIP-B
 #2 AIP-A_CSV-B
 #3 CSV-A_AIP-B
 #4 CSV-A_CSV-B

假设您想要一个 4x2 输出矩阵,请尝试 expand.grid。没有使用包。

as.matrix(expand.grid(B = B, A = A)[2:1])

给予:

     A       B      
[1,] "AIP-A" "AIP-B"
[2,] "AIP-A" "CSV-B"
[3,] "CSV-A" "AIP-B"
[4,] "CSV-A" "CSV-B"

如果顺序,是否是矩阵,标题不重要,那么expand.grid(A, B)可能就足够了。