我正在寻找矩阵每行的最大包版本(即使用比较函数compareVersion
而不是通常的max
)。我可以编写一个简单的递归循环,但我正在寻找一个更优雅的解决方案。我试过apply
没有成功:
样本数据集:
M=matrix(c("2.7.5","1.7.3","1.7.8","0.9-7","0.9-5","0.10-7"), nrow = 2, ncol = 3, byrow = TRUE)
什么行不通:
apply(M, 1, FUN = function(e1,e2) ifelse(compareVersion(e1,e2)==1, e1, e2))
是否可以避免编码递归循环?
(也许首先在简单的例子x = c(“2.7.5”,“1.7.3”,“1.7.8”),然后我可以轻松地将它应用于所有行)
答案 0 :(得分:4)
我发现最好的是使用优秀的函数Reduce
,这正是我正在寻找的递归循环
Reduce使用二进制函数来连续组合元素 给定的向量和可能给定的初始值。
矢量上的简单案例:
x = c("1.9-7","4.11-5",NA,"0.10-7")
Reduce(x=x, f=function(e1,e2) ifelse(compareVersion(e1,e2)==1, e1, e2), accumulate=FALSE)
在矩阵上:
M=matrix(c("2.7.5","1.7.3","1.7.8","0.9-7","0.9-5","0.10-7"), nrow = 2, ncol = 3, byrow = TRUE)
apply(M, 1, FUN = function(x) Reduce(x=x, f=function(e1,e2) ifelse(compareVersion(e1,e2)==1, e1, e2), accumulate=FALSE))
答案 1 :(得分:-2)
使用多变量版本mapply
mapply(function(e1,e2) ifelse(compareVersion(e1,e2)==1, e1, e2), e1=M[1,],e2=M[2,])