gpt4 book ai didi

r - 在读取多个 CSV 文件时,base R 比 readr 更快

转载 作者:行者123 更新时间:2023-12-03 14:29:30 25 4
gpt4 key购买 nike

有很多关于如何读取多个 CSV 并将它们绑定(bind)到一个数据框中的文档。我有 5000 多个 CSV 文件需要读取并绑定(bind)到一个数据结构中。

我特别关注了这里的讨论:Issue in Loading multiple .csv files into single dataframe in R using rbind

奇怪的是,base R 比我尝试过的任何其他解决方案都要快得多。

这是我的 CSV 的样子:

> head(PT)
Line Timestamp Lane.01 Lane.02 Lane.03 Lane.04 Lane.05 Lane.06 Lane.07 Lane.08
1 PL1 05-Jan-16 07:17:36 NA NA NA NA NA NA NA NA
2 PL1 05-Jan-16 07:22:38 NA NA NA NA NA NA NA NA
3 PL1 05-Jan-16 07:27:41 NA NA NA NA NA NA NA NA
4 PL1 05-Jan-16 07:32:43 9.98 10.36 10.41 10.16 10.10 9.97 10.07 9.59
5 PL1 05-Jan-16 07:37:45 9.65 8.87 9.88 9.86 8.85 8.75 9.19 8.51
6 PL1 05-Jan-16 07:42:47 9.14 8.98 9.29 9.04 9.01 9.06 9.12 9.08

我创建了三种读取和绑定(bind)数据的方法。这些文件位于一个单独的目录中,我将其定义为:
dataPath <- "data"
PTfiles <- list.files(path=dataPath, full.names = TRUE)

方法一:碱基R
classes <- c("factor", "character", rep("numeric",8))

# build function to load data
load_data <- function(dataPath, classes) {
tables <- lapply(PTfiles, read.csv, colClasses=classes, na.strings=c("NA", ""))
do.call(rbind, tables)
}

#clock
method1 <- system.time(
PT <- load_data(path, classes)
)

方法二: read_csv在这种情况下,我创建了一个包装函数供 read_csv 使用
#create wrapper function for read_csv
read_csv.wrap <- function(x) { read_csv(x, skip = 1, na=c("NA", ""),
col_names = c("tool", "timestamp", paste("lane", 1:8, sep="")),
col_types =
cols(
tool = col_character(),
timestamp = col_character(),
lane1 = col_double(),
lane2 = col_double(),
lane3 = col_double(),
lane4 = col_double(),
lane5 = col_double(),
lane6 = col_double(),
lane7 = col_double(),
lane8 = col_double()
)
)
}

##
# Same as method 1, just uses read_csv instead of read.csv

load_data2 <- function(dataPath) {
tables <- lapply(PTfiles, read_csv.wrap)
do.call(rbind, tables)
}

#clock
method2 <- system.time(
PT2 <- load_data2(path)
)

方法三: read_csv + dplyr::bind_rows
load_data3 <- function(dataPath) { 
tables <- lapply(PTfiles, read_csv.wrap)
dplyr::bind_rows(tables)
}

#clock
method3 <- system.time(
PT3 <- load_data3(path)
)

我想不通的是,为什么 read_csv 和 dplyr 方法是 较慢 耗时,他们应该更快。 CPU时间减少了,但是为什么耗时(文件系统)会增加?这里发生了什么?

编辑 - 我添加了 data.table评论中建议的方法

方法四 data.table
library(data.table)

load_data4 <- function(dataPath){
tables <- lapply(PTfiles, fread)
rbindlist(tables)
}

method4 <- system.time(
PT4 <- load_data4(path)
)
data.table从 CPU 的角度来看,该方法是最快的。但问题仍然在于 read_csv 发生了什么。使它们变得如此缓慢的方法。
> rbind(method1, method2, method3, method4)
user.self sys.self elapsed
method1 0.56 0.39 1.35
method2 0.42 1.98 13.96
method3 0.36 2.25 14.69
method4 0.34 0.67 1.74

最佳答案

我会在终端(Unix)中这样做。我会将所有文件放在同一个文件夹中,然后导航到该文件夹​​(在终端中),使用以下命令仅创建一个 CSV 文件:

cat *.csv > merged_csv_file.csv

关于此方法的一个观察结果是每个文件的标题将显示在观察结果的中间。为了解决这个问题,我建议你这样做:

仅从第一个文件中获取标题
head -2 file1.csv > merged_csv_file.csv

然后使用以下命令跳过其他文件的前“X”行,其中“X”是要跳过的行数。
tail -n +3 -q file*.csv >> merged_csv_file.csv
-n +3从第 3 行到末尾打印尾行, -q告诉它不要打印带有文件名的标题(阅读人), >>添加到文件中,而不是将其覆盖为 >。

关于r - 在读取多个 CSV 文件时,base R 比 readr 更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44033555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com