【问题标题】:matching different dimension of two matrix using sapply in r?在r中使用sapply匹配两个矩阵的不同维度?
【发布时间】:2018-01-20 15:04:36
【问题描述】:

假设我有一个包含分类数据的矩阵

X1  X2    X3
low hot  white
high hot black

然后我想通过它们的列将每个值匹配到另一个矩阵,这里是矩阵。

[[1]]
Values        V1        V2
high     0.3076923 0.6315789   
low      0.6923077 0.3684211
[[2]]
Values V1 V2
hot    1  1
[[3]]
Values        V1        V2
black 0.3076923 0.6315789
white 0.6923077 0.3684211

X1 将匹配到矩阵 [[1]] 的列表,条件是:如果它们匹配,我们将取 V1 的值。例如:第一个数据是“低”然后

low --> will compare to a matrix [[1]]
 [[1]]
Values        V1        V2
high     0.3076923 0.6315789   
low      0.6923077 0.3684211

我们将取 0.6923077。所以最终的结果应该是

0.6923077 1 0.6923077
0.3076923 1 0.3076923

如何在这种情况下使用 sapply。我知道循环,但我认为它效率不高

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    如果您的分类数据矩阵(我假设这是一个字符矩阵)命名为 mat,并且您的矩阵列表命名为 l,则应该可以:

    # Set up the example data
    mat <- matrix(c('low', 'high', 'hot', 'hot', 'white', 'black'), nrow = 2)
    l <- list(matrix(c('high', 'low', 0.3076923, 0.6923077, 0.6315789, 0.3684211),
                     nrow = 2),
              matrix(c('hot', 1, 1), nrow = 1),
              matrix(c('black', 'white', 0.3076923, 0.6923077, 0.6315789,
                       0.3684211), nrow = 2))
    
    sapply(1:ncol(mat), function(j){
        tmp_mat <- l[[j]]
        mat[ , j] <<- tmp_mat[match(tmp_mat[ , 1], mat[ , j]), 2]
    })
    
    > mat
    
         [,1]        [,2] [,3]       
    [1,] "0.6923077" "1"  "0.6923077"
    [2,] "0.3076923" "1"  "0.3076923"
    

    请注意,这会产生一个字符矩阵,因为其中每个矩阵的一列是一个字符向量(即使不是,mat 也是一个字符矩阵)导致coercion。使用as.numeric(mat) 可以轻松解决此问题。

    【讨论】:

    • 非常感谢你的帮助,我真的很感激@duckmayr
    • @Jackshephard 如果解决方案对您有用(即解决了您的问题),请不要忘记接受答案,如果您觉得有用,请点赞
    • 好像我不能投票,我没有足够的人气
    猜你喜欢
    • 2015-09-12
    • 2020-12-06
    • 2016-08-03
    • 2013-08-17
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    相关资源
    最近更新 更多