2012-01-04 7 views
14

Supongamos que tengo una función que crea marcos de datos. Me gustaría ejecutar esa función con diferentes valores de entrada, y luego rbind los resultados juntos en una trama de datos grande, como a continuación:¿Forzar mapply para devolver una lista?

CreateDataFrame <- function(type="A", n=10, n.true=8) { 
    data.frame(success=c(rep(TRUE, n.true), rep(FALSE, n - n.true)), type=type) 
} 
df <- do.call(rbind, lapply(toupper(letters[1:5]), CreateDataFrame)) 

Mi función CreateDataFrame toma tres argumentos. En el ejemplo anterior, los argumentos segundo y tercero se mantienen constantes. Me gustaría hacer lo mismo que el anterior, pero los argumentos segundo y tercero cambian en cada llamada. Creo que tengo que usar mapply, así:

mapply("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4) 

Tengo problemas porque mapply no devuelve una lista, lo que me impide correr do.call(rbind, mapply(...)). ¿Cómo puedo terminar con un único marco de datos, como lo hice en el ejemplo de la parte superior?

Parece que mapply está devolviendo una matriz de listas. Esperaba que devolviera una lista de marcos de datos. ¿Qué debería hacer de manera diferente?

Respuesta

23

Para obtener una lista de data.frames como valor de retorno, establezca mapply como argumento SIMPLIFY en FALSE. (Su valor predeterminado es TRUE, que dirige la función para "intentar reducir el resultado a un vector, matriz o matriz dimensional superior", justo lo que experimentó).

res <- mapply("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4, 
       SIMPLIFY = FALSE) 

identical(class(res), "list") 
[1] TRUE 
+2

¡Gracias! En retrospectiva, debería haber leído el manual más de cerca. – Adrian

+3

No hay problema. Me llevó un buen rato aprender que cada vez que me encontraba pensando "¿no sería bueno si la función X hiciera Y", había una posibilidad decente de que el creador de la función me hubiera golpeado hasta el pensamiento! –

+7

es tan tonto que simplifica debe estar en capital. Su forma no coincide con las funciones de grupo sapply – adam

4

Alternativa puede utilizar la función de Mapa. Básicamente se aplica con SIMPLIFICAR establecido en FALSO.

Map("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4) 
+0

bien qué tal eso. Aprenda algo nuevo cada día – theforestecologist

Cuestiones relacionadas