文本矩阵乘法

时间:2016-07-15 14:47:47

标签: r matrix 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

5 个答案:

答案 0 :(得分:4)

您可以将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"

答案 1 :(得分:2)

不确定您对&#34;乘法&#34;的定义但是使用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"

答案 2 :(得分:2)

此方法使用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"

答案 3 :(得分:2)

以下是使用CJ

data.table的选项
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

答案 4 :(得分:2)

假设您需要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)就足够了。