2011-03-25 19 views
6

Estoy intentando crear un data.frame desde el cual crear un gráfico. Tengo una función y dos vectores que quiero usar como las dos entradas. Esto se simplifica un poco, pero básicamente todo lo que tengo es:conceptos básicos mapply? - cómo crear una matriz a partir de dos vectores y una función

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]))) 

y todo lo que quiero es un hoja.de.datos con 3 columnas para los valores avgGPA, y 16 filas para los valores relGPA con los valores resultantes de la Células.

Pido disculpas por lo básico que es esto, pero le aseguro que he intentado que esto ocurra sin su ayuda. He intentado seguir los ejemplos en las páginas de manual de sapply y mapply, pero soy un poco nuevo para R para ver lo que estoy tratando de hacer.

Gracias!

Respuesta

4

no se puede probar con la información ofrecida, pero esto debería funcionar:

expGPA <- outer(relGPA, avgGPA, FUN=f) # See below for way to make this "work" 

Otra función útil cuando se desea generar combinaciones es expand.grid y esto sería conseguir que la "forma larga":

expGPA2 <-expand.grid(relGPA, avgGPA) 
expGPA2$fn <- apply(expGPA2, 1, f) 

La forma larga es lo que esperará la red y ggplot como formato de entrada para un trazado de mayor nivel.

EDITAR: Puede ser necesario construir un método más específico para pasar referencias de columna a la función como lo señala djhurio y (resuelto) por Sam Swift con la estrategia Vectorize. En el caso de apply, la función sum funcionaría de la forma descrita anteriormente, pero el operador de división no lo haría, así que aquí hay otro ejemplo que se puede generalizar a funciones más complejas con múltiples argumentos. Todas las necesidades de programador es el número de la columna para el argumento apropiado en el "apply()" - Función ed", debido a que (por desgracia) los nombres de las columnas no son llevadas a través de la x argumento:

> 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 : (05/01/2013) en cuanto a este un año más tarde, me di cuenta de que la función de SamSwift podría ser vectorizado por lo que su uso corporal "+" en lugar de sum:

1/(1+exp(relGPA*pred.model$coef[1] + avgGPA*pred.model$coef[2]) # all vectorized fns 
+1

'F' debe ser una función vectorizada a úselo en 'outer'. Y' apply' no funciona así. Vea mi edición. – djhurio

+1

Gracias DWin, eso fue lo que hizo, y djhurio está en lo cierto como bien. Agregué "vf <- Vectorize (f, SIMPLIFY = FALSE)" después de definir mi función, y luego era exactamente lo que necesitaba. –

Cuestiones relacionadas