我们假设我们有以下三个向量。
L = c("1", "3")
K = c("2", "9", "2:9")
S = c("7")
有没有办法将它们组合成一个看起来像上面的矩阵?
L K S
1 0 0
3 0 0
0 2 0
0 9 0
0 2:9 0
0 0 7
谢谢。
答案 0 :(得分:4)
以下是另一种方法:首先创建一个0的矩阵,然后使用索引k
和1:l
的两个向量,在右侧输入值位置。
l = length(c(L,K,S))
k = rep(1:3,times=c(length(L),length(K),length(S)))
m = matrix(0,ncol=3,nrow=l)
m[cbind(1:l,k)] = c(L,K,S)
[,1] [,2] [,3]
[1,] "1" "0" "0"
[2,] "3" "0" "0"
[3,] "0" "2" "0"
[4,] "0" "9" "0"
[5,] "0" "2:9" "0"
[6,] "0" "0" "7"
编辑:对于根据@DavidArenburg评论更好地概括为更多输入向量的版本,您可以这样做:
l = list(L,K,S)
len = length(unlist(l))
k = rep(seq_along(l), lengths(l))
m = matrix(0, nrow=len, ncol=length(l))
m[cbind(1:len, k)] = unlist(l)
答案 1 :(得分:2)
这是一个想法。首先,我们创建一个包含所有向量的列表,然后创建一个矩阵,其行数等于向量的所有元素的总和,列数等于向量的数量。然后,我们使用mapply
将第一个向量的元素(列表中的元素)与矩阵的第一列进行匹配。分别与第二和第三个向量和列相同。然后我们使用它(逻辑矩阵)将矩阵的所有剩余不匹配元素转换为0。
l1 <- list(L, K, S)
m1 <- matrix(unlist(l1), nrow = sum(lengths(l1)), ncol = length(l1))
m1[!mapply(`%in%`, as.data.frame(m1), l1)] <- 0
m1
# [,1] [,2] [,3]
#[1,] "1" "0" "0"
#[2,] "3" "0" "0"
#[3,] "0" "2" "0"
#[4,] "0" "9" "0"
#[5,] "0" "2:9" "0"
#[6,] "0" "0" "7"
为了解决你的评论并将其升级为也使用出现在多个向量中的相同值,我们遵循相同的逻辑,但我们根据每个向量的累积序列对矩阵的每列的索引进行操作。由于这有点复杂,我们可以把它全部放在一个函数中,它接受一个矢量列表作为输入,即
create_mat <- function(list){
m1 <- matrix(unlist(list), nrow = sum(lengths(list)), ncol = length(list))
m2 <- matrix(seq(nrow(m1)), ncol = ncol(m1), nrow = nrow(m1))
l2 <- lapply(lengths(list), seq)
v2 <- c(0, head(cumsum(lengths(list)), -1))
l2 <- Map(`+`, l2, v2)
m1[!mapply(`%in%`, as.data.frame(m2), l2)] <- 0
return(m1)
}
# Test with some values being same for multiple vectors,
M = c("1", "3")
N = c("1", "9", "2:9")
P = c("3")
create_mat(list(M, N, P))
# [,1] [,2] [,3]
#[1,] "1" "0" "0"
#[2,] "3" "0" "0"
#[3,] "0" "1" "0"
#[4,] "0" "9" "0"
#[5,] "0" "2:9" "0"
#[6,] "0" "0" "3"
答案 2 :(得分:1)
library(dplyr)
L = c("1", "3")
K = c("2", "9", "2:9")
S = c("7")
Ltable <- tibble(L=L)
Ktable <- tibble(K=K)
Stable <- tibble(S=S)
JoinedMatrix <- Ltable %>% bind_rows(Ktable) %>% bind_rows(Stable) %>% as.matrix()
JoinedMatrix[which(is.na(JoinedMatrix))] <- "0"
来自bind_rows
的 dplyr
允许您将数据帧(或元组)绑定在一起。由于三个元素具有不同的命名列,因此在连接后它们将保持为不同的列,并使用NA
填充缺少的字段。之后,我们只需将所有NA
替换为0
,我们就完成了。
> JoinedMatrix
L K S
[1,] "1" "0" "0"
[2,] "3" "0" "0"
[3,] "0" "2" "0"
[4,] "0" "9" "0"
[5,] "0" "2:9" "0"
[6,] "0" "0" "7"