2012-01-15 9 views
12

Vorrei costruire un frame di dati in un loop aggiungendo una nuova colonna ogni volta utilizzando cbind. Provo il seguente:espandere dinamicamente le colonne di un frame di dati utilizzando cbind

test <- NULL 
df <- data.frame(x=c(1,2,3,4)) 
test <- cbind(test, df) 

Questo genera un errore:

Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 0, 4 

Qual è il modo corretto per istanziare un frame di dati vuota in R e quindi associare ad esso in un ciclo?

Grazie

+2

Questo può essere molto lento se si dispone di molte colonne. Vedere il R Inferno per alcuni suggerimenti sulle prestazioni http://www.burns-stat.com/pages/Tutor/R_inferno.pdf –

risposta

16

È necessario creare test come una struttura che ha lo stesso numero di righe in modo che cbind.data.frame non genera un errore:

test <-data.frame(row.names=1:4) 
df <- data.frame(x=c(1,2,3,4)) 
test <- cbind(test, df) 

test 
    x 
1 1 
2 2 
3 3 
4 4 

Due altri metodi:

> test <-data.frame(row.names=1:4) 
>  test[['x']] <-c(1,2,3,4) 
> test 
    x 
1 1 
2 2 
3 3 
4 4 


> test <-data.frame(row.names=1:4) 
>  test[1] <-list(x=c(1,2,3,4)) 
> test 
    x 
1 1 
2 2 
3 3 
4 4 
+1

Cosa succede se le colonne hanno lunghezze diverse? Come li mantieni allineati rispetto alla riga? Come roba NA per valori mancanti? – Pradeep

+0

In una parola ... si. Tu pad. –

11

Come ha sottolineato Roman Luštrik, potrebbe essere inefficiente utilizzare cbind. Puoi iniziare con la lista vuota e dopo il ciclo convertirlo in data.frame.

test <- list() 
# inner loop assigment 
test <- c(test,list(c(1:4))) 
# after loop 
test <- as.data.frame(test) 
+0

grazie! questo è utile per i miei scopi dato che ho una grande quantità di dati – Alex

Problemi correlati