如何根据类别从矩阵中提取值?

时间:2015-12-18 14:23:51

标签: r

我有3个矩阵B是数字类别,而m1m2是不同的值。 我想为m1中的每个类别(数字)提取m2B的值。我为B中的每个类别(数字)创建了cols,并用它们的数字命名,然后用m1m2

中的相应值填充它们
 B = matrix(  c(2, 3, 3, 1, 2, 1,3,1),   nrow=4,  ncol=2)
 m1<-matrix(nrow=4,ncol=2,data=runif(8))
 m2<-matrix(nrow=4,ncol=2,data=runif(8))
       > B
           [,1] [,2]
    [1,]    2    2
    [2,]    3    1
    [3,]    3    3
    [4,]    1    1
   > m1
              [,1]      [,2]
     [1,] 0.02628084 0.7286645
     [2,] 0.48612723 0.5551138
     [3,] 0.54268103 0.0734144
     [4,] 0.83666012 0.1365023
       > m2
      [,1]       [,2]
     [1,] 0.9753650 0.01225462
     [2,] 0.3843785 0.64147320
     [3,] 0.4886735 0.51257497
     [4,] 0.4907762 0.32035212

期望的输出:

                  2                            3                1
0.02628084(#corresponding value from m1)    0.48612723    0.83666012
0.9753650(#corresponding value from m2)      0.3843785      0.4907762
0.7286645 (#corresponding value from m1)    0.5551138         0.54268103
0.01225462 (#corresponding value from m2)  0.64147320     0.4886735
                                           0.0734144       0.1365023
                                           0.51257497      0.32035212

2 个答案:

答案 0 :(得分:0)

我不确定这是不是你想要的。它会为您列出第一个元素,其中包含m1m2中与B中的1位于同一位置的值。第二个元素包含2的值,依此类推。

set.seed(123)
B = matrix(  c(2, 3, 3, 1, 2, 1,3,1),   nrow=4,  ncol=2)
m1<-matrix(nrow=4,ncol=2,data=runif(8))
m2<-matrix(nrow=4,ncol=2,data=runif(8))

values <- sort(unique(sapply(B, function(x) x)))
l <- sapply(values, function(x) c(m1[B == x], m2[B == x]))

添加值名称:

names(l) <- values

答案 1 :(得分:0)

您对此解决方案和输出格式感到满意吗?

# data:
set.seed(123)
B = matrix(  c(2, 3, 3, 1, 2, 1,3,1),   nrow=4,  ncol=2)
m1<-matrix(nrow=4,ncol=2,data=runif(8))
m2<-matrix(nrow=4,ncol=2,data=runif(8))


ml <- list(m1, m2)
ind <- sapply(unique(c(B)), function(x) which(B == x, arr.ind = TRUE))
res <- lapply(ind, function(x) lapply(ml, function(y) y[x]))

lapply(res, function(x) c(t(do.call(cbind, x))))
[[1]]
[1] 0.2875775 0.5514350 0.9404673 0.6775706

[[2]]
[1] 0.7883051 0.4566147 0.4089769 0.9568333 0.5281055 0.1029247

[[3]]
[1] 0.8830174 0.4533342 0.0455565 0.5726334 0.8924190 0.8998250

由于列的长度不同,您无法将其放入数据框或矩阵中。

使用的数据是(使用set.seed生成样本会更容易):

 m1
          [,1]      [,2]
[1,] 0.2875775 0.9404673
[2,] 0.7883051 0.0455565
[3,] 0.4089769 0.5281055
[4,] 0.8830174 0.8924190
> m2
          [,1]      [,2]
[1,] 0.5514350 0.6775706
[2,] 0.4566147 0.5726334
[3,] 0.9568333 0.1029247
[4,] 0.4533342 0.8998250
> B
     [,1] [,2]
[1,]    2    2
[2,]    3    1
[3,]    3    3
[4,]    1    1