основы маппли? - как создать матрицу из двух векторов и функции

Я пытаюсь создать data.frame, из которого можно создать график. У меня есть функция и два вектора, которые я хочу использовать в качестве двух входов. Это немного упрощено, но в основном все, что у меня есть, это:

relGPA <- seq(-1.5,1.5,.2)
avgGPA <- c(-2,0,2)

f <- function(relGPA, avgGPA) 1/(1+exp(sum(relGPA*pred.model$coef[1],avgGPA*pred.model$coef[2])))

и все, что мне нужно, это data.frame с 3 столбцами для значений avgGPA и 16 строками для значений relGPA с результирующими значениями в ячейках.

Прошу прощения за то, что это элементарно, но уверяю вас, я пытался сделать это без вашей помощи. Я пытался следовать примерам на справочных страницах sapply и mapply, но я слишком новичок в R, чтобы понять, что я пытаюсь сделать.

Спасибо!


person Sam Swift    schedule 25.03.2011    source источник


Ответы (1)


Невозможно проверить предложенную информацию, но это должно работать:

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
person IRTFM    schedule 25.03.2011
comment
f должна быть векторизованной функцией, чтобы использовать ее в outer. А apply так не работает. Смотрите мою правку. - person djhurio; 26.03.2011
comment
Спасибо DWin, это помогло, и djhurio тоже прав. Я добавил vf ‹- Vectorize(f, SIMPLIFY = FALSE) после того, как определил свою функцию, и тогда external оказался именно тем, что мне было нужно. - person Sam Swift; 26.03.2011