2012-01-15 12 views
12

Chciałbym zbudować ramkę danych w pętli dodając nową kolumnę za każdym razem przy użyciu cbind. I spróbuj wykonać następujące czynności:dynamicznie rozszerzać kolumny ramek danych przy użyciu cbind

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

ten generuje błąd:

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

Co to jest poprawny sposób do wystąpienia pustej ramki danych w R, a następnie powiązać go w pętli?

Dzięki

+2

Może to być bardzo powolne, jeśli masz dużo kolumn. Zobacz R Inferno, aby uzyskać porady dotyczące wydajności http://www.burns-stat.com/pages/Tutor/R_inferno.pdf –

Odpowiedz

16

Musisz utworzyć test jako strukturę, która ma taką samą liczbę wierszy, tak aby cbind.data.frame nie wygeneruje błąd:

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 

Dwie inne metody:

> 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

Co się stanie, jeśli kolumny mają nierówne długości? Jak utrzymujesz je w rzędzie? Jak NA rzeczy o brakujących wartościach? – Pradeep

+0

Jednym słowem ... tak. Ty pad. –

11

Jak zauważył Roman Luštrik, użycie cindli może być nieefektywne. Możesz zacząć od pustej listy, a po pętli konwertuj ją do data.frame.

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

dzięki! to jest przydatne dla moich celów, ponieważ mam dużą ramkę danych – Alex

Powiązane problemy