将两个参数的函数应用于n×2矩阵

时间:2015-04-09 15:02:22

标签: r

我写过这个函数

tippett <- function(p1, p2) {
  t <- 1 - (1 - min(p1, p2))^2
  return(list(p.value=t))
}

我希望将其应用于生成数字水平的矩阵中。例如,在此矩阵中:z <- matrix(c(rbeta(5, 1, 5), rbeta(5, 1, 10)), ncol=2)

不幸的是,apply似乎无法以这种方式使用它s<-apply(z,1,tippett)

生成此错误

Error in FUN(newX[, i], ...) : argument "p2" is missing, with no default
你可以告诉我怎么能绕过那个?我希望将这个过程概括为数千行,我无法想象手动完成它。

谢谢。

2 个答案:

答案 0 :(得分:3)

我认为你可以改变你的功能......

tippett<-function(p){
t<-1-(1-min(p))^2
return(list(p.value=t))
}

然后你的函数调用应该工作。 (我没有测试过这个......)

s<-apply(z,1,tippett)

或者,如果您无法更改此功能,您可以尝试类似......

s <- sapply(seq_along(nrow(z)), function(i) tippett(z[i,1], z[i,2]))

我认为这一切都应该奏效。抱歉,目前正在运行一些代码,无法验证/测试它。

答案 1 :(得分:3)

在一行中尝试:

tippet2 = function(z) as.list(1-(1-do.call(pmin, as.data.frame(z)))^ncol(z))

tippet2(z)
  • 这是矢量化的。
  • 这适用于您的矩阵或包含更多列的矩阵。