这是我的两个文本矩阵:
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
答案 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;的定义但是使用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"
答案 2 :(得分:2)
此方法使用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"
答案 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)
就足够了。