основы mapply? Как создать матрицу из двух векторов и функции - PullRequest
6 голосов
/ 26 марта 2011

Я пытаюсь создать 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 с результирующими значениямив клетках.

Я прошу прощения за то, насколько это важно, но уверяю вас, я пытался сделать это без вашей помощи.Я пытался следовать примерам на страницах руководства «Саппи и Мэппли», но я немного новичок в R, чтобы понять, что я пытаюсь сделать.

Спасибо!

1 Ответ

4 голосов
/ 26 марта 2011

Не может быть протестировано с предложенной информацией, но это должно работать:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...