应用一个函数,该函数将两个向量作为输入到两个矩阵的相应列(在 R 中)

Apply a function that takes two vectors as input to two matrices across their corresponding columns (in R)

我在 R 中有一个函数接受两个向量和一个整数,如下所示:

MyFunction<-function(MyLoot, DungeonLoot, DungeonOrder)
{  

  # Perfect Match
  PerfectMatch = MyLoot[1]==DungeonLoot[1]
  
  # Group Match
  GroupandClassMatch = (MyLoot[2]==DungeonLoot[2])&(MyLoot[3]>=DungeonLoot[3])
  
  # Order Match
  OrderMatch = MyLoot[5]==DungeonOrder
  
  # Order Match +1
  OrderMatchPlusOne = (OrderMatch)&(MyLoot[8]==1)
  
  # Final Score
  Score = PerfectMatch*1 + GroupandClassMatch*1 + OrderMatch*2 + OrderMatchPlusOne*1
  
  return(Score)
}

现在我想将 MyFunction 应用到两个矩阵 Matrix1 and Matrix2 中,这样我就有了一个看起来像这样的向量:

c(MyFunction(Matrix1[1,],Matrix2[1,],12),MyFunction(Matrix1[2,],Matrix2[2,],12),...,MyFunction[Matrix1[n,],Matrix2[n,],12)

最好(也是最有效)的方法是什么?我可以使用 for 循环,但想知道是否有更好的方法,例如使用 apply、sapply、mapply、lappy 函数之一

示例数据以及预期输出将有助于更好地理解问题。但是,我认为您不需要任何循环或应用函数来执行此操作。如果您将输入作为矩阵,那么您应该可以直接执行此操作。

试试,

rowSums(Matrix1 == Matrix2)
#For only specific columns
#rowSums(Matrix1[, 1:2] == Matrix2[, 1:2])

这实现了我想要的 - 虽然不确定它是否是计算效率最高的解决方案。

t(mapply(function(x,y) MyFunction(x,y,11), split(MyLoot, col(MyLoot)), split(DungeonLoot, col(DungeonLoot))))

您新发布的函数仍然很容易向量化:

MyFunction <- function(MyLoot, DungeonLoot, DungeonOrder) {  
  # Perfect Match
  PerfectMatch <- MyLoot[1,] == DungeonLoot[1,]
  
  # Group Match
  GroupandClassMatch <- (MyLoot[2,] == DungeonLoot[2,]) & (MyLoot[3,] >= DungeonLoot[3,])
  
  # Order Match
  OrderMatch <- MyLoot[5,] == DungeonOrder
  
  # Order Match +1
  OrderMatchPlusOne <- OrderMatch & (MyLoot[8,] == 1)
  
  # Final Score
  Score <- PerfectMatch + GroupandClassMatch + OrderMatch*2 + OrderMatchPlusOne
  
  return(Score)
}

MyFunction(Matrix1, Matrix2, 12)