2012-01-04 14 views
14

Supponiamo che abbia una funzione che crea i frame di dati. Vorrei eseguire tale funzione con differenti valori di ingresso, e poi rbind i risultati in un'unica grande trama di dati, come di seguito:Forza mapply per restituire 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)) 

funzione My CreateDataFrame prende tre argomenti. Nell'esempio sopra, il secondo e il terzo argomento sono mantenuti costanti. Mi piacerebbe fare lo stesso di sopra, ma il secondo e il terzo argomento cambiano ad ogni chiamata. Penso che devo usare mapply, in questo modo:

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

Ho problemi a causa mapply non restituisce una lista, che mi impedisce di correre do.call(rbind, mapply(...)). Come posso finire con un singolo frame di dati, come ho fatto nell'esempio in alto?

Sembra che mapply restituisca una matrice di elenchi. Mi aspettavo che restituisse una lista di frame di dati. Cosa dovrei fare in modo diverso?

risposta

23

Per ottenere un elenco di data.frames come valore di ritorno, impostare l'argomento SIMPLIFY su FALSE. (Il suo valore predefinito è TRUE, che indirizza la funzione a "tentare di ridurre il risultato su un vettore, matrice o array di dimensioni superiori" - solo ciò che si è verificato).

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

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

Grazie! A posteriori, avrei dovuto leggere il manuale più da vicino. – Adrian

+3

Nessun problema. Mi ci è voluto un po 'prima che imparassi che ogni volta che mi trovavo a pensare "non sarebbe bello se la funzione X facesse Y", c'era una buona possibilità che il creatore della funzione mi avesse battuto al pensiero! –

+7

è così stupido che la semplificazione deve essere nel capitale. La sua forma non combacia con le simpatiche funzioni di gruppo – adam

4

alternativa è possibile utilizzare la funzione di mappa. Fondamentalmente è mappato con SEMPLIFY impostato su FALSE.

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

e che ne dici? Impara qualcosa di nuovo ogni giorno – theforestecologist

Problemi correlati