【问题标题】:R element wise subtraction of matrices矩阵的R元素减法
【发布时间】:2015-04-28 18:40:33
【问题描述】:

我有两个不同长度的 1 列矩阵。两个矩阵都有共同的行名和其他行名,每个行名都是唯一的(并且可能不具有相同的顺序)。如何将两者相减以确保每个共同元素彼此相减?例如:

> mat1
  [,1]
a    1
b    2
c    3
d    4
e    5
f    6

> mat2
  [,1]
x    1
a    2
y    3
b    4

> mat3
  [,1]
a    -1
b    -2
c    3
d    4
e    5
f    6
x    -1
y    -3

where mat3 <- mat1 - mat2

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    试试这个:

     #creating your matrices
     mat1<-matrix(1:6,ncol=1,dimnames=list(letters[1:6],NULL))
     mat2<-matrix(1:4,ncol=1,dimnames=list(c("x","a","y","b"),NULL))
     #getting the unique rownames
     rows<-unique(c(rownames(mat1),rownames(mat2)))
     #creating an "empty" mat3
     mat3<-matrix(0,nrow=length(rows),ncol=1,dimnames=list(rows,NULL))
     #filling values
     mat3[rownames(mat1),]<-mat1
     mat3[rownames(mat2),]<-mat3[rownames(mat2),]-mat2
    

    【讨论】:

    • 我原本打算使用%in% 函数来查找公共行,但您的解决方案更好...
    【解决方案2】:

    我的建议是避免使用行名。行名难以管理,因为一个变量(行名)的处理方式与其他变量不同。这违反了tidy data 的原则。

    我会使用dplyr::add_rownames() 将行名转换为数据集中的变量:

    library(dplyr)
    

    数据

    mat1 <- matrix(1:6, ncol = 1, dimnames = list(letters[1:6]))
    mat2 <- matrix(1:4, ncol = 1, dimnames = list(c("x", "a", "y", "b")))
    

    转换为data.frame并制作变量:

    d1 <- add_rownames(data.frame(mat1), var = "name")
    d2 <- add_rownames(data.frame(mat2), var = "name")
    

    合并计算结果:

    d <- merge(d1, d2, by = "name", all = TRUE)
    
    d %>%
      rowwise() %>%
      mutate(result = sum(mat1, -mat2, na.rm = TRUE))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 2020-11-29
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多