【问题标题】:Replace values in one matrix with values from another将一个矩阵中的值替换为另一个矩阵中的值
【发布时间】:2020-08-08 12:21:17
【问题描述】:

我是一个试图比较两个矩阵的编程新手。如果 mat1 中第一列中的元素与 mat2 中第一列中的任何元素匹配,那么我希望 mat1 中的匹配元素被替换为 mat2 中匹配的邻居(同一行不同列)。

输入:

mat1<-matrix(letters[1:5])
mat2<-cbind(letters[4:8],1:5)

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

> mat2
     [,1] [,2]
[1,] "d"  "1" 
[2,] "e"  "2" 
[3,] "f"  "3" 
[4,] "g"  "4" 
[5,] "h"  "5" 

希望的输出:

> mat3
     [,1]
[1,] "a" 
[2,] "b" 
[3,] "c" 
[4,] "1" 
[5,] "2" 

我尝试了以下操作但没有成功:

> for(x in mat1){mat3<-ifelse(x==mat2,mat2[which(x==mat2),2],mat1)}
> mat3
     [,1] [,2]
[1,] "a"  "a" 
[2,] "2"  "b" 
[3,] "c"  "c" 
[4,] "d"  "d" 
[5,] "e"  "e" 

任何建议将不胜感激。花了一整天没有让它工作。如果元素在矩阵或数据框中,对我来说并不重要。

谢谢。

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    ifelse 是vectorized 所以,我们可以在整个列上使用它。通过检查'mat1'的第一列值是否为%in%'mat2'的第一列,在ifelse中创建test逻辑条件,然后,得到与match对应的值的索引,提取具有该索引的第二列的值,否则返回“mat1”的第一列

    mat3 <- matrix(ifelse(mat1[,1] %in% mat2[,1],
             mat2[,2][match(mat1[,1], mat2[,1])], mat1[,1]))
    mat3
    #     [,1]
    #[1,] "a" 
    #[2,] "b" 
    #[3,] "c" 
    #[4,] "1" 
    #[5,] "2" 
    

    【讨论】:

      【解决方案2】:

      这是另一种基本的 R 解决方案

      v <- `names<-`(mat2[,2],mat2[,1])
      mat3 <- matrix(unname(ifelse(is.na(v[mat1]),mat1,v[mat1])))
      

      给了

      > mat3
           [,1]
      [1,] "a" 
      [2,] "b" 
      [3,] "c" 
      [4,] "1" 
      [5,] "2" 
      

      【讨论】:

      • 更高级的解决方案。非常感谢托马斯。
      【解决方案3】:

      仅使用逻辑运算而不是函数的选项

      mat3 <- mat1
      mat3[mat1[,1] %in% mat2[,1], 1] <- mat2[mat2[,1] %in% mat1[,1], 2]
      

      对值进行子集化以找到两者中都出现的值并在它们出现的地方替换它们

      【讨论】:

      • 非常简单的解决方案。我最初试图这样做,但失败了。非常感谢。
      猜你喜欢
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多