将大型 csv 加载到数据框中,同时保持列结构

Posted

技术标签:

【中文标题】将大型 csv 加载到数据框中,同时保持列结构【英文标题】:Load large csv's into dataframe while maintaining column structure 【发布时间】:2018-12-14 22:37:09 【问题描述】:

我正在尝试将一个包含大文件(总共 3500 万行)的文件夹加载到 R 中,并将其作为数据框。

我已经设法加载数据,尽管使用下面的代码确实需要 10/15 分钟,但是问题是 csv 中的所有列都变成了 1 列。这是我的代码:

# Load files

temp = list.files(path ="D:/", pattern="*.csv", full.names = TRUE)
myfiles = lapply(temp, read.delim)

# Make Dataframe

df_list = lapply(seq(length(myfiles)),function(i)
  df = as.data.frame(myfiles[i], stringsAsFactors = FALSE)
)

head(do.call(bind_rows,df_list))

df = as.data.frame(data.table::rbindlist(df_list, use.names=TRUE, fill=TRUE))

csv 的列可能如下所示:

|A|B|C|D1|E|

但是在我的数据框中输出如下:

|A.B.C.D1..E|

如有任何解决此维护列问题的帮助,我们将不胜感激。

【问题讨论】:

您使用的是read.delim,但如果是csv,则需要设置sep=","(ps 看看fread 重新编辑:如果分隔符是|,那么您需要相应地设置它。 谢谢,这两种解决方案都有效,但是 fread 是如前所述,速度稍快。 【参考方案1】:

您可以使用 fread() 更快地读取 csv 并使用 rbindlist() 组合列表中的数据。两者都来自data.table 包。

library(data.table)


# Load files
temp = list.files(path ="D:/", pattern="*.csv", full.names = TRUE)

使用fread() 代替read.delim()

myfiles = lapply(temp, fread)

由于没有提供可重复的数据:

df_list <- lapply(1:5, function(x) 
  set.seed(x)

  rows <- sample(1:32, 2)
  mtcars[rows, ]
)

组合列表中的数据:

df <- rbindlist(df_list)

这是结果:

     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
 1: 22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
 2: 16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
 3: 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
 4: 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
 5: 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
 6: 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
 7: 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
 8: 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
 9: 14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
10: 15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2

【讨论】:

谢谢,这两种解决方案都有效,但是 fread 是如前所述,速度稍快。

以上是关于将大型 csv 加载到数据框中,同时保持列结构的主要内容,如果未能解决你的问题,请参考以下文章

在 Dataflow 中使用啥转换来合并具有不同列的 csv 文件,同时将它们加载到 BigQuery?

pyspark 使用模式将 csv 文件加载到数据框中

将大型 CSV 文件加载到核心数据中的最快方法是啥

使用 map reduce 将数据从大型 csv 文件加载到 sql server

将大型 csv 加载到 mysql 等 RDB 的推荐方法

Numpy - 将具有第一行的csv作为名称立即加载到结构化数组中?