2017-06-14 15 views
5

Đây là câu hỏi tiếp theo cho this one. Cách nhanh nhất để đọc các tệp .xlsx vào R là gì?Cách nhanh để đọc/ghi các tệp xlsx vào/từ R

Tôi sử dụng library(xlsx) để đọc dữ liệu từ 36 .xlsx tệp. Nó hoạt động. Tuy nhiên, vấn đề là điều này rất tốn thời gian (hơn 30 phút), đặc biệt khi xem xét dữ liệu trong mỗi tập tin không phải là lớn (ma trận có kích thước 3 * 3652 trong mỗi tệp). Để kết thúc này, có tốt hơn để đối phó với vấn đề như vậy, xin vui lòng? Có cách nào khác nhanh chóng để đọc .xlsx vào R? Hoặc tôi có thể đặt 36 tệp vào một tệp csv duy nhất một cách nhanh chóng và sau đó đọc vào R?

Hơn nữa, tôi vừa nhận ra rằng readxl không thể ghi xlsx. Có một đối tác của nó để đối phó với văn bản thay vì đọc?

"đáp ứng cho những người bình chọn câu hỏi này xuống":

Câu hỏi này là về thực tế thay vì cái gọi là "câu trả lời khăng khăng và spam" vì tốc độ là thời gian và thời gian là thực tế nhưng NOT ý kiến.

cập nhật thêm:

Có lẽ người ta có thể giải thích cho chúng tôi bằng ngôn ngữ đơn giản tại sao một số phương pháp hoạt động nhanh hơn nhiều so với những người khác. Tôi chắc chắn bối rối về điều này.

+6

sử dụng 'readxl :: read_excel() ', nó thường là nhanh hơn – scoa

+3

Hoặc thử' openxlsx' hoặc 'readxl'package. – Jaap

+3

Đây là một câu hỏi hoàn toàn hợp lý giống như chúng ta đã thấy các câu hỏi khác trong SO về cách nhanh nhất để đọc hoặc ghi các tệp '.csv' trong R. Câu trả lời cho các câu hỏi sẽ yêu cầu điểm chuẩn và nó có thể quan tâm cho một lượng lớn khán giả –

Trả lời

1

Đây là thử nghiệm điểm chuẩn nhỏ. Kết quả: readxl::read_xlsx trung bình khoảng hai lần nhanh như openxlsx::read.xlsx trên số hàng khác nhau (n) và cột (p) sử dụng cài đặt chuẩn.

enter image description here

options(scipen=999) # no scientific number format 

nn <- c(1, 10, 100, 1000, 5000, 10000, 20000, 30000) 
pp <- c(1, 5, 10, 20, 30, 40, 50) 

# create some excel files 
l <- list() # save results 
tmp_dir <- tempdir() 

for (n in nn) { 
    for (p in pp) { 
    name <- 
    cat("\n\tn:", n, "p:", p) 
    flush.console() 
    m <- matrix(rnorm(n*p), n, p) 
    file <- paste0(tmp_dir, "/n", n, "_p", p, ".xlsx") 

    # write 
    write.xlsx(m, file) 

    # read 
    elapsed <- system.time(x <- openxlsx::read.xlsx(file))["elapsed"] 
    df <- data.frame(fun = "openxlsx::read.xlsx", n = n, p = p, 
        elapsed = elapsed, stringsAsFactors = F, row.names = NULL) 
    l <- append(l, list(df)) 

    elapsed <- system.time(x <- readxl::read_xlsx(file))["elapsed"] 
    df <- data.frame(fun = "readxl::read_xlsx", n = n, p = p, 
        elapsed = elapsed, stringsAsFactors = F, row.names = NULL) 
    l <- append(l, list(df)) 

    } 
} 

# results 
d <- do.call(rbind, l) 

library(ggplot2) 

ggplot(d, aes(n, elapsed, color= fun)) + 
    geom_line() + geom_point() + 
    facet_wrap(~ paste("columns:", p)) + 
    xlab("Number of rows") + 
    ylab("Seconds") 
Các vấn đề liên quan