【问题标题】:How could I merge two square matrix into one square matrix?如何将两个方阵合并为一个方阵?
【发布时间】:2021-06-22 23:15:00
【问题描述】:

我有两个大方阵 (100X100)(例如 A 和 B),我想将它们合并为一个方阵(200*200)作为 C。Id 是随机的,并且它们在两个矩阵之间是不同的。见附件,先谢谢了。

合并方阵

数据

A <- matrix(c(4,12.5,23.9,12.5,6,11.3,13.9,11.3,9), ncol = 3, byrow = TRUE, dimnames = list(c("1","3","6"), c("1","3","6"))) 
B <- matrix(c(5,10.2,9.3,10.2,7,8.5,9.3,8.5,8), ncol = 3, byrow = TRUE, dimnames = list(c("2","4","5"), c("2","4","5")))

【问题讨论】:

  • 请不要将数据作为图片发布。以易于重现的方式(即使用dput)将它们直接复制到问题中。请显示您尝试过的代码以及您的预期输出是什么
  • A

标签: r matrix merge


【解决方案1】:

也许更冗长,但假设您正在使用两个数据帧:

df1 <- data.frame(
  row_id = c(1, 3, 6),
  v1 = c(4, 12.5, 13.9),
  v3 = c(12.5, 6, 11.3),
  v6 = c(23.9, 11.3, 9),
  stringsAsFactors = FALSE
)

df2 <- data.frame(
  row_id = c(2, 4, 5),
  v2 = c(5, 10.2, 9.3),
  v4 = c(10.2, 7, 8.5),
  v5 = c(9.3, 8.5, 8),
  stringsAsFactors = FALSE
)

然后您可以执行以下操作(更新):

df1 <- df1 %>% 
  `colnames<-`(c('row_id', paste0('V', df1$row_id))) %>% 
  pivot_longer(cols=!row_id, names_to = 'column', values_to = 'val') %>% 
  mutate(col_id = readr::parse_number(column), .keep='unused')

df2 <- df2 %>% 
  `colnames<-`(c('row_id', paste0('V', df2$row_id))) %>% 
  pivot_longer(cols=!row_id, names_to = 'column', values_to = 'val') %>% 
  mutate(col_id = readr::parse_number(column), .keep='unused')

df_new <- bind_rows(df1, df2)

size = max(c(df1$row_id, df2$row_id))
df_final <- matrix(0, nrow=size, ncol=size)

for (i in 1:dim(df_new)[1]) {
  df_final[df_new$row_id[i], df_new$col_id[i]] <- df_new$val[i]
}

如果你只想看到相关的单元格,你可以减少矩阵:

data.frame(df_final) %>% 
  filter_all(any_vars(. != 0)) %>% 
  select_if(colSums(.) != 0)

#    X10  X20  X30  X40 X50  X60
# 1  4.0  0.0 12.5  0.0 0.0 23.9
# 2  0.0  5.0  0.0 10.2 9.3  0.0
# 3 12.5  0.0  6.0  0.0 0.0 11.3
# 4  0.0 10.2  0.0  7.0 8.5  0.0
# 5  0.0  9.3  0.0  8.5 8.0  0.0
# 6 13.9  0.0 11.3  0.0 0.0  9.0

【讨论】:

  • 非常感谢
  • 您好威廉,感谢您的回答。在这里,您将每列/行读取为 V1、V3、V6(df1),当我有 1000 个 id,例如 df1 的 49901、49905 等,以及 df2 的 49902、49902、49904、49906 时,我该如何解决这个问题。提前致谢。
  • 您是在问列名并不总是与 row_id 匹配吗?在这种情况下,您可以使用 colnames(df1) &lt;- c('row_id', paste0('V', df1$row_id))colnames(df2) &lt;- c('row_id', paste0('V', df2$row_id))
  • 谢谢,先生,现在 df_new 的维度是 2000000 (1000*1000*2) 和 df_final [<-(*tmp*, df_new$row_id[i], df_new$col_id[i], value = df_new$val[i]) : 下标越界
  • 亲爱的威廉,df1
【解决方案2】:

如果 col 和 row 名称是 C 的索引,那么这样的方法可以工作:

C <- matrix(0, nrow = nrow(A)+nrow(B), ncol = ncol(A)+ncol(B))

C[as.numeric(rownames(A)), as.numeric(colnames(A))] <- A
C[as.numeric(rownames(B)), as.numeric(colnames(B))] <- B

数据:

A <- matrix(c(4,12.5,23.9,12.5,6,11.3,13.9,11.3,9), ncol = 3, byrow = TRUE,
            dimnames =  list(c("1","3","6"),
                             c("1","3","6")))
B <- matrix(c(5,10.2,9.3,10.2,7,8.5,9.3,8.5,8), ncol = 3, byrow = TRUE,
            dimnames =  list(c("2","4","5"),
                             c("2","4","5")))

【讨论】:

  • 非常感谢
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 2018-05-03
  • 2018-09-20
  • 1970-01-01
相关资源
最近更新 更多