【问题标题】:Combining a list of matrices into a single matrix while appending new values to previous columns将矩阵列表组合成单个矩阵,同时将新值附加到先前的列
【发布时间】:2020-06-04 00:35:42
【问题描述】:

所以我有一个包含 17 个矩阵的列表,我想将它们组合成一个主矩阵。但是,我还希望附加而不是覆盖观察的不同值。举个简单的例子,

m1 <- matrix( c(1, 0, 0, 0, 1, 0, 0, 0, 1), nrow=3, ncol=3) 
rownames(m1) <- c("x", "y", "z")
colnames(m1) <- c("a", "b", "c")


m2 <- matrix( c(2, 0, 0, 0, 2, 0, 0, 0, 2), nrow=3, ncol=3)
rownames(m2) <- c("a", "d", "e")
colnames(m2) <- c("x", "w", "z")


m3_final <- matrix( c(0, 0, 0, 2, 0, "1;2", 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2), nrow=5, ncol=4)
rownames(m3_final) <- c("a", "b", "c", "d", "e")
colnames(m3_final) <- c("w", "x", "y", "z")

我目前的想法是在列表中运行一个 for 循环,以便从每个矩阵迭代到一个空的主矩阵开始,但我无法将新结果附加到先前的结果。我当前的错误:

m1 <- matrix( c(1, 0, 0, 0, 1, 0, 0, 0, 1), nrow=3, ncol=3) 
rownames(m1) <- c("x", "y", "z")
colnames(m1) <- c("a", "b", "c")


m2 <- matrix( c(2, 0, 0, 0, 2, 0, 0, 0, 2), nrow=3, ncol=3)
rownames(m2) <- c("a", "d", "e")
colnames(m2) <- c("x", "w", "z")


m3_final <- matrix( c(0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 2), nrow=5, ncol=4)
rownames(m3_final) <- c("a", "b", "c", "d", "e")
colnames(m3_final) <- c("w", "x", "y", "z")

感谢您的帮助!

【问题讨论】:

  • 建议使用dput而不是图像共享数据。请阅读有关how to ask a good question 以及如何提供reproducible example 的信息。
  • 谢谢!希望现在有一些代码会更好
  • 是的,谢谢,这样更好,但我不明白您在这里要做什么。您正在将 m1 的列名与 m2 的行名进行比较,反之亦然以组合结果?
  • 我想做的存储为m3_final。基本上将 m1 和 m2 组合在一起,但是在 a 下 x 有另一个值的情况下,它被附加为“1;2”,而不是被覆盖为 m3_error 中显示的“2”。我正在使用的数据都是字符串,但我认为用数字矩阵表示会更容易
  • a下没有x。可以复查吗? m1m2 ?

标签: r matrix


【解决方案1】:

一种方法(可能不会提高效率)是将矩阵展平,绑定它们,然后将它们重新整形为宽格式,将公共索引的值与paste() 连接起来。

library(dplyr)
library(tidyr)
library(purrr)
library(tibble)

list(m1, m2) %>%
  map_df(as.data.frame.table) %>%
  filter(Freq != 0) %>%
  pivot_wider(names_from = Var1, values_from = Freq, values_fn = list(Freq = ~ paste(.x, collapse = ";")), values_fill = list(Freq = "0")) %>% 
  select(Var2, sort(tidyselect::peek_vars())) %>%
  column_to_rownames(var = "Var2") %>%
  as.matrix()

  w   x     y   z  
a "0" "1;2" "0" "0"
b "0" "0"   "1" "0"
c "0" "0"   "0" "1"
d "2" "0"   "0" "0"
e "0" "0"   "0" "2"

请注意,您在示例中的一个矩阵中混淆了行名和列名。

【讨论】:

    猜你喜欢
    • 2017-05-03
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多