我有一个关于在R中匹配两个矩阵以执行非常简单计算的问题。我有有效的代码(如下),但我觉得肯定有更有效和“R式”的方法来实现它。任何线索都非常受欢迎。
问题: 我有两个相关信息的矩阵。m1包含一堆参考文献,m2包含关于这些参考文献的数据(零或一)。当您查找m2中的数据时,我想知道哪些m1行在第一列中有“0”,在第二列中有“1”。以下是一个玩具示例:
一般的属性是我已经可以保证m1中的每个条目都有一个对应的行名称在m2中,我需要在更大的矩阵上执行这个操作几百万次,因此速度很重要。
我想做的是使用m2来确定m1的哪些行在第一列中有零,在第二列中有1。 在这种情况下,只有m1的最后一行具有该属性。
我的解决方案
我有一个相对不错的解决方案,它使用apply()和不太差:
这个方法可以正常运作,但感觉有些笨重。 我的问题 是否有更加智能/快速/自然 的方法来完成这个任务?我查看了match()和相关函数,但无法得出解决方案。在此搜索相关问题也是如此。提问的部分原因是我不是很擅长R编程,所以即使这种方法是可行的,我也很想看看别人是如何解决它的。
谢谢任何帮助。
问题: 我有两个相关信息的矩阵。m1包含一堆参考文献,m2包含关于这些参考文献的数据(零或一)。当您查找m2中的数据时,我想知道哪些m1行在第一列中有“0”,在第二列中有“1”。以下是一个玩具示例:
> 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中的每个条目都有一个对应的行名称在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
这个方法可以正常运作,但感觉有些笨重。 我的问题 是否有更加智能/快速/自然 的方法来完成这个任务?我查看了match()和相关函数,但无法得出解决方案。在此搜索相关问题也是如此。提问的部分原因是我不是很擅长R编程,所以即使这种方法是可行的,我也很想看看别人是如何解决它的。
谢谢任何帮助。