2015-04-01 22 views
18

Tôi có một for loop tạo khung dữ liệu sau mỗi lần lặp. Tôi muốn nối tất cả các khung dữ liệu với nhau nhưng thấy khó khăn. Sau đây là những gì tôi đang cố gắng, xin đề nghị làm thế nào để sửa chữa nó:Nối các khung dữ liệu với nhau theo vòng lặp for

d = NULL 
for (i in 1:7){ 

# vector output 
model <- #some processing 

# add vector to a dataframe 
df <- data.frame(model) 

} 

df_total <- rbind(d,df) 

Trả lời

43

Đừng làm điều đó bên trong vòng lặp. Tạo một danh sách, sau đó kết hợp chúng bên ngoài vòng lặp.

datalist = list() 

for (i in 1:5) { 
    # ... make some data 
    dat <- data.frame(x = rnorm(10), y = runif(10)) 
    dat$i <- i # maybe you want to keep track of which iteration produced it? 
    datalist[[i]] <- dat # add it to your list 
} 

big_data = do.call(rbind, datalist) 
# or big_data <- dplyr::bind_rows(datalist) 
# or big_data <- data.table::rbindlist(datalist) 

Đây là cách R nhiều hơn để làm việc. Nó cũng có thể nhanh hơn đáng kể, đặc biệt nếu bạn sử dụng dplyr::bind_rows hoặc data.table::rbindlist để kết hợp khung dữ liệu cuối cùng.

+0

Nó cũng hoạt động nhưng tôi muốn viết tất cả các danh sách cho các cột riêng biệt – Ibe

+0

@Bạn có thực sự nên chỉnh sửa câu hỏi của mình sau đó không. Cung cấp dữ liệu mẫu và đầu ra mong muốn (xem bình luận của tôi trong câu trả lời của maRtin) và đưa 'rbind' ra khỏi câu hỏi của bạn, bởi vì tất cả' rbind' đều liên kết các hàng với nhau. – Gregor

+1

vừa thay thế 'rbind' trong mã của bạn bằng' cbind'. Nó hoạt động và bây giờ tôi có tất cả các danh sách trong các cột riêng biệt – Ibe

2

chỉ cố gắng này:

df_total = data.frame() 
for (i in 1:7){ 

# vector output 
model <- #some processing 

# add vector to a dataframe 
df <- data.frame(model) 
df_total <- rbind(df_total,df) 
} 
+0

Nó gắn thêm khung sau khung trong cột duy nhất. Làm cách nào để nối thêm tất cả các khung dữ liệu vào các cột riêng biệt? – Ibe

+0

sử dụng cbind() thay vì rbind() – maRtin

+0

sử dụng 'cbind()' dẫn đến 'Lỗi trong data.frame (..., check.names = FALSE): đối số ngụ ý khác nhau số hàng: 0, 18262 ' – Ibe

2

Again Martin là đúng nhưng để làm việc này bạn đã bắt đầu với một dataframe rằng đã có ít nhất một cột

model <- #some processing 
df <- data.frame(col1=model) 

for (i in 2:17) 
{ 
    model <- # some processing 
    nextcol <- data.frame(model) 
    colnames(nextcol) <- c(paste("col", i, sep="")) # rename the comlum 
    df <- cbind(df, nextcol) 
} 
+0

nó hoạt động nhưng nối thêm dữ liệu vào một cột đơn. Tôi muốn tất cả các khung dữ liệu nằm trong các cột riêng biệt – Ibe

1

Trong khóa học Coursera, Giới thiệu về Lập trình R, kỹ năng này đã được kiểm tra. Họ cung cấp cho tất cả các sinh viên 332 tệp csv riêng biệt và yêu cầu họ lập trình kết hợp một số tệp để tính toán giá trị trung bình của chất gây ô nhiễm.

Đây là giải pháp của tôi:

# create your empty dataframe so you can append to it. 
    combined_df <- data.frame(Date=as.Date(character()), 
        Sulfate=double(), 
        Nitrate=double(), 
        ID=integer()) 
    # for loop for the range of documents to combine 
    for(i in min(id): max(id)) { 
    # using sprintf to add on leading zeros as the file names had leading zeros 
    read <- read.csv(paste(getwd(),"/",directory, "/",sprintf("%03d", i),".csv", sep="")) 
    # in your loop, add the files that you read to the combined_df 
    combined_df <- rbind(combined_df, read) 
    } 
Các vấn đề liên quan