【问题标题】:Fill option for freadfread 的填充选项
【发布时间】:2013-09-03 16:47:21
【问题描述】:

假设我有这个 txt 文件:

"AA",3,3,3,3
"CC","ad",2,2,2,2,2
"ZZ",2
"AA",3,3,3,3
"CC","ad",2,2,2,2,2

read.csv 我可以:

> read.csv("linktofile.txt", fill=T, header=F)
  V1 V2 V3 V4 V5 V6 V7
1 AA  3  3  3  3 NA NA
2 CC ad  2  2  2  2  2
3 ZZ  2 NA NA NA NA NA
4 AA  3  3  3  3 NA NA
5 CC ad  2  2  2  2  2

但是fread 给了

> library(data.table)

> fread("linktofile.txt")
   V1 V2 V3 V4 V5 V6 V7
1: CC ad  2  2  2  2  2

我可以使用fread 获得相同的结果吗?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    重大更新

    fread 的开发计划似乎已更改,fread 现在获得了 fill 参数。

    使用此答案末尾的相同示例数据,这就是我得到的:

    library(data.table)
    packageVersion("data.table")
    # [1] ‘1.9.7’
    fread(x, fill = TRUE)
    #    V1 V2 V3 V4 V5 V6 V7
    # 1: AA  3  3  3  3 NA NA
    # 2: CC ad  2  2  2  2  2
    # 3: ZZ  2 NA NA NA NA NA
    # 4: AA  3  3  3  3 NA NA
    # 5: CC ad  2  2  2  2  2
    

    安装“data.table”的开发版本:

    install.packages("data.table", 
                     repos = "https://Rdatatable.github.io/data.table", 
                     type = "source")
    

    原答案

    这不能回答您关于fread 的问题:@Matt 已经解决了这个问题。

    但是,它确实为您提供了一个替代方案,可以考虑与基本 R 的 read.csv 相比,它可以为您带来很好的速度改进。

    fread 不同,您必须通过向它们提供有关您尝试读取的数据的一些信息来帮助这些功能。

    您可以使用“iotools”中的input.file 函数。通过指定列类型,您可以告诉格式化程序函数需要多少列。

    library(iotools)
    input.file(x, formatter = dstrsplit, sep = ",",
               col_types = rep("character", max(count.fields(x, ","))))
    

    样本数据

    x <- tempfile()
    myvec <- c('"AA",3,3,3,3', '"CC","ad",2,2,2,2,2', '"ZZ",2', '"AA",3,3,3,3', '"CC","ad",2,2,2,2,2')
    cat(myvec, file = x, sep = "\n")
    
    ## Uncomment for bigger sample data
    ## cat(rep(myvec, 200000), file = x, sep = "\n")
    

    【讨论】:

      【解决方案2】:

      目前没有;我不知道read.csv 的填充功能。计划是添加读取 分隔文件的功能(sep2 以及 sep 中提到的 ?fread)。然后可以将可变长度向量读入list 列,其中每个单元格本身就是一个向量。但是,不使用 NA 填充。

      你能把它加到the list吗?这样您就会在其状态发生变化时收到通知。

      有很多像这样的不规则数据格式吗?我只记得曾经看过常规文件,其中不完整的行将被视为错误。

      更新:不太可能完成。 fread 针对常规 分隔文件(其中每一行具有相同的列数)进行了优化。但是,在实现sep2 时,可以将不规则文件读入list 列(每个单元格本身就是一个向量);没有像read.csv 那样填写单独的列。

      【讨论】:

      • UK Utility 中的所有行业数据流都类似于 4 个示例。通过包含不同记录的各方发送数百万个文本文件(然后将行插入到不同的表中,上面可以是AACCZZ 不同表的名称)。一个文件内的所有记录都与同一个行业流程相关(所以它们一起发送,但也为了节省空间)并且一旦拆分您想在SQL中创建主键和辅助键,或者使用roll与文件名和行导入data.table 中的号码(非常感谢!)
      • @Michele 感谢您提供重要信息。这些文件大吗?即,read.csv 是否存在速度问题?
      • 当我执行数据导入时,我通常在开始一个新项目时有数千个文件(有 50 到 200000 条记录)(那么它只是每天导入新的文件)。 read.csv 为我节省了大量时间,而且比我们的官方(我做/只能使用 R 来制作原型)T-SQL 导入脚本更快。唯一的问题是:我将read.csv 放在for 中,并且在每个循环中,文件都完全存储在列表项中。在几千个文件之后,这个过程(我有平均速度的进度条)变得慢得多,我猜它的列表变得很大...... [继续]
      • 我使用this lappend 函数更新列表,并且每次都如此制作副本。除了改进列表更新之外,我只是想使用 fread 来改进从 csv 到任何 R 对象的“纯”导入时间。
      • @Michele 很难更改fread 来处理这些文件。它针对每行具有相同列数的常规分隔格式进行了优化。正确的列数会预先分配给正确的行数,等等。但是,这些文件可能会被读入list 列。
      猜你喜欢
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 2018-11-30
      • 1970-01-01
      • 2019-11-24
      • 2018-06-28
      • 2013-07-16
      相关资源
      最近更新 更多