应用一个函数,该函数将两个向量作为输入到两个矩阵的相应列(在 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)
我在 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)