用另一个矩阵的行名称替换R中的矩阵值
我有一个关于匹配R中的两个矩阵以执行非常简单的计算的问题。我有工作代码(见下文),但我觉得必须有一种更高效、更像R的方法。欢迎提供任何线索 问题 我有两个矩阵和相关信息。m1包含一组引用。m2包含这些引用的数据(零或一)。我想知道当您从m2中查找数据时,m1的哪些行在第一列中有“0”,在第二列中有“1”。下面是一个玩具示例:用另一个矩阵的行名称替换R中的矩阵值,r,matrix,match,R,Matrix,Match,我有一个关于匹配R中的两个矩阵以执行非常简单的计算的问题。我有工作代码(见下文),但我觉得必须有一种更高效、更像R的方法。欢迎提供任何线索 问题 我有两个矩阵和相关信息。m1包含一组引用。m2包含这些引用的数据(零或一)。我想知道当您从m2中查找数据时,m1的哪些行在第一列中有“0”,在第二列中有“1”。下面是一个玩具示例: > m1 <- matrix(data = c(51,52,53,51,54,55,56,57), nrow = 4, ncol = 2) > m1
> m1 <- matrix(data = c(51,52,53,51,54,55,56,57), nrow = 4, ncol = 2)
> m1
[,1] [,2]
[1,] 51 54
[2,] 52 55
[3,] 53 56
[4,] 51 57
> m2 <- matrix(data = c(0,0,1,0,0,1,1), nrow = 7, ncol = 1)
> rownames(m2) <- c(51,52,53,54,55,56,57)
> m2
[,1]
51 0
52 0
53 1
54 0
55 0
56 1
57 1
>m1
[,1] [,2]
[1,] 51 54
[2,] 52 55
[3,] 53 56
[4,] 51 57
>m2行名称(m2)m2
[,1]
51 0
52 0
53 1
54 0
55 0
56 1
57 1
一般属性是,我已经可以保证m1中的每个条目在m2中都有一个对应的行名称,我需要在更大的矩阵上执行数百万次,所以速度是有用的
我要做的是使用m2来计算m1的哪些行在第一列中有零,在第二列中有1。在这种情况下,只有m1的最后一行具有该属性
我的解决方案
我有一个相对不错的解决方案,它使用apply(),还不错:
> is.zero.one <- function(line, m2){
+ start = m2[as.character(line[1]),]
+ end = m2[as.character(line[2]),]
+ if(start==0 && end==1){return(TRUE)}
+ else{return(FALSE)}
+}
> apply(m1, 1, is.zero.one, m2)
[1] FALSE FALSE FALSE TRUE
>is.zero.one应用(m1,1,is.zero.one,m2)
[1] 假假假真
这个很好用。但感觉很笨重
我的问题
有人知道一种更聪明/更快/更自然的方法吗?我查看了match()和相关函数,但没有找到解决方案。在这里搜索相关问题也一样。我问这个问题的部分原因是我不是一个很好的R程序员,所以即使这是一个不错的解决方案,我也非常有兴趣看看其他人会如何解决它
感谢您的帮助。矩阵(m2[匹配(m1,行名(m2))],ncol=2)
matrix( m2[ match(m1, rownames(m2) )], ncol=2)
[,1] [,2]
[1,] 0 0
[2,] 0 0
[3,] 1 1
[4,] 0 1
m3 <- matrix(m2[match(m1, rownames(m2) )], ncol=2)
which( m3[,1]==0 & m3[,2]==1 )
#[1] 4
m3[,1]==0 & m3[,2]==1
# [1] FALSE FALSE FALSE TRUE
[,1] [,2]
[1,] 0 0
[2,] 0 0
[3,] 1 1
[4,] 0 1
m3