Не может быть протестировано с предложенной информацией, но это должно работать:
expGPA <- outer(relGPA, avgGPA, FUN=f) # See below for way to make this "work"
Еще одна полезная функция, когда вы хотите генерировать комбинации, это expand.grid
, и вы получите «длинную форму»:
expGPA2 <-expand.grid(relGPA, avgGPA)
expGPA2$fn <- apply(expGPA2, 1, f)
Длинная форма - это то, что решетки и ggplot будут ожидать в качестве входного формата для построения графиков более высокого уровня.
РЕДАКТИРОВАТЬ: Может быть необходимо создать более конкретный метод для передачи ссылок на столбцы функции, как указано djhurio и (решено) Сэмом Свифтом со стратегией Vectorize
. В случае apply
функция sum
будет работать «из коробки», как описано выше, но оператор деления не будет, так что вот еще один пример, который можно обобщить для более сложных функций с несколькими аргументами. Все, что нужно программисту, - это номер столбца для соответствующего аргумента в функции «apply ()» - ed », потому что (к сожалению) имена столбцов не переносятся в аргумент x
:
> expGPA2$fn <- apply(expGPA2, 1, function(x) x[1]/x[2])
> str(expGPA2)
'data.frame': 48 obs. of 3 variables:
$ Var1: num -1.5 -1.3 -1.1 -0.9 -0.7 ...
$ Var2: num -2 -2 -2 -2 -2 -2 -2 -2 -2 -2 ...
$ fn : num 0.75 0.65 0.55 0.45 0.35 ...
- attr(*, "out.attrs")=List of 2
..$ dim : int 16 3
..$ dimnames:List of 2
.. ..$ Var1: chr "Var1=-1.5" "Var1=-1.3" "Var1=-1.1" "Var1=-0.9" ...
.. ..$ Var2: chr "Var2=-2" "Var2= 0" "Var2= 2"
Edit2: (2013-01-05) Посмотрев на это год спустя, я понял, что функцию SamSwift можно векторизовать, используя ее тело "+" вместо sum
:
1/(1+exp( relGPA*pred.model$coef[1] + avgGPA*pred.model$coef[2]) # all vectorized fns