【问题标题】:how to change value of matrix with for loop using another matrix in r?如何使用r中的另一个矩阵通过for循环更改矩阵的值?
【发布时间】:2014-10-24 17:18:50
【问题描述】:

我有两个矩阵; m1和m2

m1:
  a  b  c  d  e
x 0  0  0  0  0
y 0  0  0  0  0
x 0  0  0  0  0


m2:
  y
a 1.2
c 1.5
e 1.4

这是我的代码;

 for (i in 1:4){
   if colnames(m1[i]) in rownanmes(m2[i])
        m1["y", i] == m2[i]
 }

到目前为止,我得到了这个矩阵,

  a    b    c    d  e
x 0    0    0    0  0
y 1.2  1.5  1.4  NA NA
x 0    0    0    0  0

但我想创建这样的矩阵;

  a    b  c    d  e
x 0    0  0    0  0
y 1.2  0  1.5  0  1.4
x 0    0  0    0  0

有什么建议吗?谢谢

【问题讨论】:

  • 您能否提供完整的dput 输出m1 而不是...

标签: r if-statement for-loop matrix


【解决方案1】:

另一种选择是:

indx <- Map(intersect, dimnames(t(m2)), dimnames(m1))
m1[indx[[1]], indx[[2]]] <- m2[indx[[2]], indx[[1]]]
m1
#    a b   c d   e
#x 0.0 0 0.0 0 0.0
#y 1.2 0 1.5 0 1.4
#x 0.0 0 0.0 0 0.0

更新

基于m2dput 输出(在cmets 中),m2 的列名是m2 并且因为m1 的行名和m2 的列名之间没有相交,当你使用代码时,它不会替换任何东西。

 m1[indx[[1]], indx[[2]]] <- m2[indx[[2]], indx[[1]]]
 m1
 #  a b c d e
 #x 0 0 0 0 0
 #y 0 0 0 0 0
 #x 0 0 0 0 0

数据

m1 <-  structure(c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
  0L, 0L), .Dim = c(3L, 5L), .Dimnames = list(c("x", "y", "x"), 
   c("a", "b", "c", "d", "e")))

m2 <-  structure(c(1.2, 1.5, 1.4), .Dim = c(3L, 1L), .Dimnames = list(
        c("a", "c", "e"), "y"))

【讨论】:

  • “mapply 中的错误(FUN = f, ..., SIMPLIFY = FALSE):零长度输入不能与非零长度的输入混合”给出了这样的错误。还有其他建议吗?谢谢
  • 平方米
  • @user3525533 m1 呢?是一样的吗?
  • m1
  • @user3525533 在您的 dput 输出中,m2 的列名是 m2。另外,请显示完整的输出而不是....,因为它不起作用。尝试将其粘贴到您的控制台中,您会收到错误消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
相关资源
最近更新 更多