2012-04-03 17 views
9

Ho bisogno di creare un data.frame che verrà popolato una riga alla volta dai risultati di un ciclo for. Ha 45 colonne: i nomi di cinque di questi sono statici ma il resto viene letto in (come un vettore) da un file CSV esterno in fase di esecuzione. Sto cercando qualcosa lungo le linee diCreare un data.frame in R con nomi di colonne assegnati dinamicamente

goalsMenu <- read.csv("Phase 1 goalsmenu.csv", header = TRUE) 
colHeads <- c("analysis","patient","date",as.vector(goalsMenu$Name),"CR") 
output <- data.frame(colHeads) 

tuttavia questo crea una data.frame una colonna con nome della colonna di colHeads.

colHeads <- list("analysis","patient","date",as.vector(goalsMenu$Name),"CR") 

sembra un passo nella giusta direzione, ma ho bisogno di "appiattire" esso per creare la struttura desiderata data.frame

potrebbe consigliarvi per favore?

+0

Quale classe deve essere ogni colonna? – mdsumner

risposta

8

Fa questo aiuto?

goalsMenu <- paste("Name", 1:40, sep="") 
output <- as.data.frame(matrix(rep(0, 5 + length(goalsMenu)), nrow=1)) 
names(output) <- c("analysis", "patient", "date", goalsMenu, "CR1", "CR2") 

Fondamentalmente, creare un data.frame output con il numero di colonne prima e denominare tali colonne nella fase successiva. Tuttavia, sii consapevole del commento di mdsumner! In questo modo, tutte le colonne sono di classe numeric. Puoi occupartene successivamente: change the class of columns in data.frame

+0

Grazie - ha funzionato (anche se è necessario rimuovere la prima riga all-zero in seguito). Con l'eccezione (come ci si aspetterebbe) di data, tutte le colonne sono numeriche (i primi due numeri di riferimento interi, il resto tutto float) –

+0

@RobForsyth Poiché hai detto che stai eseguendo il looping delle righe comunque per riempire quel data.frame, I pensa che devi solo iniziare con la prima riga e sostituire gli zeri lì. Inoltre, questo dovrebbe sovrascrivere automaticamente la classe della colonna. La tua domanda ha una risposta allora? O stai cercando qualcos'altro? Nel caso sia il primo, sarebbe bello se potessi accettare il mio o la risposta di Allan, quindi questo è fuori lista. Altrimenti, sarebbe bello se tu potessi dare più dettagli e potrei dare un altro tentativo ;-) O forse qualcun altro ha una soluzione migliore (immagino ce ne sia una). –

+0

scusa - nuovo per l'etichetta Stackoverflow! Ora segnato ha risposto: grazie ancora! –

5

Se è possibile riempire il frame con (alcuni) dati prima, è possibile assegnare solo nomi(). In caso contrario, si dovrà fare l'elenco prima (e poi convertire in data.frame):

col.names <- LETTERS[1:10] # Example column names 
data <- vector("list", length(col.names)) 
names(data) <- col.names 
print(str(data))   # Inspect the structure 

Spero che questo aiuti

Problemi correlati