将具有不同长度的矢量一个接一个地合并到一个矩阵中

时间:2017-07-09 19:12:38

标签: r matrix vector

我们假设我们有以下三个向量。

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

谢谢。

3 个答案:

答案 0 :(得分:4)

以下是另一种方法:首先创建一个0的矩阵,然后使用索引k1: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"