2014-07-21 36 views
0

可以说我有两个列表清单,一个清单是二进制清单,另一个是定量清单。列表中的顺序很重要。我想将二进制矩阵映射到它的定性对象上,同时创建一个具有相同维数的相同数量的嵌套矩阵的新列表。这些矩阵将是其质量对应物的子集;二进制矩阵中有1个。子集矩阵:将二进制矩阵映射到定性矩阵上1s而不是0s,同时保持矩阵维度不变

# dummy data 

dat1 <- c(0,1,0,1,1,0,0,0,1,0,0,0,1,1,0,1) 
mat1 <- matrix(dat1, ncol=4, nrow=4, byrow=T) 

dat2 <- c(1,1,0,1,0,0,1,1,0,1,0,1,0,1,0,0) 
mat2 <- matrix(dat1, ncol=4, nrow=4, byrow=T) 

lsMat1 <- list(mat1, mat2) 

dat3 <- c(0.3,0.1,0.6,0.3,0.9,0.1,0.1,0.3,0.6,0.2,0.7,0.8,0.4,0.1,0.4,0.5) 
mat3 <- matrix(dat3, ncol=4, nrow=4, byrow=T) 

dat4 <- c(0.5,0.3,0.6,0.8,0.1,0.4,0.5,0.1,0.5,0.1,0.0,0.1,0.4,0.6,0.0,0.8) 
mat4 <- matrix(dat4, ncol=4, nrow=4, byrow=T) 

lsMat2 <- list(mat3, mat4) 

所需的新嵌套列表

[[1]] 
    [,1] [,2] [,3] [,4] 
[1,] 0.0 0.1 0 0.3 
[2,] 0.9 0.0 0 0.0 
[3,] 0.6 0.0 0 0.0 
[4,] 0.4 0.1 0 0.5 

[[2]] 
    [,1] [,2] [,3] [,4] 
[1,] 0.0 0.3 0 0.8 
[2,] 0.1 0.0 0 0.0 
[3,] 0.5 0.0 0 0.0 
[4,] 0.4 0.6 0 0.8 

任何指针将不胜感激,谢谢!

+0

这是所需的“新”列表上面提供的测试数据的正确值?根据你的定义它似乎不正确。 – MrFlick

+0

欢呼声发表评论。是的,这是主意,但由于我手工做过,所以我可能会引入错误。我会检查并纠正它。 –

回答

2

我打算假设您在上面提供的输出是不正确的。既然你的二进制矩阵中有0和1,并且你只想保留1的值,你可以使用简单的元素相乘。你可以做到这一点对列表中的每个项目与

Map(`*`, lsMat1, lsMat2) 

返回

[[1]] 
    [,1] [,2] [,3] [,4] 
[1,] 0.0 0.1 0 0.3 
[2,] 0.9 0.0 0 0.0 
[3,] 0.6 0.0 0 0.0 
[4,] 0.4 0.1 0 0.5 

[[2]] 
    [,1] [,2] [,3] [,4] 
[1,] 0.0 0.3 0 0.8 
[2,] 0.1 0.0 0 0.0 
[3,] 0.5 0.0 0 0.0 
[4,] 0.4 0.6 0 0.8 

给出在lsMat1两个矩阵的列三个是全为0,这似乎更正确。

+0

谢谢你,我正在寻找什么。对我的例子中的错字感到抱歉。 –

0

如果我明白这个问题,我会做一个元素明智的矩阵乘法。林不熟悉您发布的语法,但在MATLAB:

MAT1 * MAT3

现在,在您的二元矩阵都是零的所有元素将保持为零,和所有的人会成为您的定性值矩阵。

希望它有帮助!

+0

错过了R标签-_- –