Есть ли версия Vectorize
, которая использует apply
, а не mapply
? Я хотел был бы векторизовать функцию, которая принимает векторный вход таким образом, который позволяет мне передать массив этой функции и вернуть вектор.Версия Vectorize() для apply(), а не mapply()?
Конечно, я могу написать свою собственную упаковку, и это работает достаточно хорошо. Но я задавался вопросом, построена ли эта функциональность?
Я также могу использовать Vectorize
, но тогда мне нужно преобразовать матричный вход в data.frame для его работы. Например:
LAMBDA <- cbind(c(1, .5, .5), c(.5, 1, .5), c(.5, .5, 1))
THETA <- c(0,0,1)
NU <- 21
my.data <- array(1:6, c(3,2))
my.fun <- Vectorize(pmt, vectorize.args="x")
Тогда
> my.fun(my.data, mean=THETA, S=LAMBDA, df=NU)
[1] 0.4404142 0.8130572 0.9667065 0.9961166 0.9996274 0.9999676
Который не то, что я хочу, но
> my.data <- data.frame(my.data)
> my.fun(my.data, mean=THETA, S=LAMBDA, df=NU)
X1 X2
0.8130572 0.9996274
является то, что я хочу.
BTW, pmt
является из пакета mnormt и является многоквартирным студентом t cdf.
Вы имеете в виду 'my.data' может быть вектором вместо матрицы? Если да, можете ли вы просто создать матрицу с одним столбцом? – Aaron
Если это так, все, что вам нужно, это 'apply (matrix (my.data, nrow = 3), 2, pmt, mean = THETA, S = LAMBDA, df = NU)'. Это работает как на векторах, так и на матрицах. – Aaron
@ Решение Aaron лучше, чем мое решение if then else, по крайней мере, с точки зрения удобочитаемости. Я думаю, что 'Vectorize' делает что-то подобное в' args <- lapply (as.list (match.call()) [- 1L], eval, parent.frame()) '. Не то, чтобы я это полностью понял. – kalu