文本矩阵乘法
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" 的定义,但使用 cbind
和 rep
你会得到这个:
> 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.grid
与 Reduce
和 paste
:
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)
可能就足够了。
这是我的两个文本矩阵:
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" 的定义,但使用 cbind
和 rep
你会得到这个:
> 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.grid
与 Reduce
和 paste
:
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)
可能就足够了。