【问题标题】:R data.table error with option fill=TRUE in freadR data.table 错误,fread 中的选项 fill=TRUE
【发布时间】:2016-08-12 08:51:32
【问题描述】:

我正在使用 R.3.3.1。在工作 PC 上的 RStudio 0.99.903 中。

我有一个制表符分隔的文件,我正试图用 fread 读取它。不幸的是,有些行以双标签结尾,而另一些则没有。

这是我数据的前几行:

[1] "1054434\t01-01-2015\t-1\tAMOUNT OWN MUSIC\t12\t\t"               
[2] "1054434\t01-01-2015\t-1\tDVDS\t2\t"                            
[3] "1054434\t01-01-2015\t-1\tINIT TV\t2\t\t"                         
[4] "1054434\t01-01-2015\t-1\tINIT2\t4\t\t"                           
[5] "1054434\t01-01-2015\t-1\tIntro_other_TV\t2\t\t"    

我认为我可以使用选项 fill=TRUE 解决此问题,但我收到以下错误消息:

test<-fread(filenames[1], header = FALSE, fill = TRUE) 
Error in fread(filenames[1], header = FALSE, fill = TRUE) : 
unused argument (fill = TRUE)

我不明白为什么 fill 不起作用,因为根据帮助文件,它绝对是一个有效的选项...

我正在使用 data.table 1.9.6。来自 CRAN,当我尝试安装 github 版本时收到此错误消息:

* installing *source* package 'data.table' ...
** libs

*** arch - i386
Warning: running command 'make -f "Makevars" -f "D:/R- 33~1.1/etc/i386/Makeconf" -f "D:/R-33~1.1/share/make/winshlib.mk" SHLIB="data.table.dll" OBJECTS="assign.o bmerge.o chmatch.o dogroups.o fastmean.o fcast.o fmelt.o forder.o frank.o fread.o fsort.o fwrite.o gsumm.o ijoin.o init.o openmp-utils.o quickselect.o rbindlist.o reorder.o shift.o subset.o transpose.o uniqlist.o vecseq.o wrappers.o"' had status 127
ERROR: compilation failed for package 'data.table'
* removing 'D:/R-3.3.1/library/data.table'
Warning in install.packages :
running command '"D:/R-33~1.1/bin/x64/R" CMD INSTALL -l "D:\R-3.3.1\library"    C:\Users\swiftc47\AppData\Local\Temp\RtmpeYBevK/downloaded_packages/data.table_1.9.7.tar.gz' had status 1
Warning in install.packages :
installation of package ‘data.table’ had non-zero exit status

【问题讨论】:

  • 为什么在 fread 中使用 fill ?我不认为fread 有这个论点。

标签: r data.table


【解决方案1】:

1.9.6 没有 fill 选项 - 尝试更新到当前 CRAN 版本 (1.9.8+),其中 fill = TRUE 工作正常:

fread("test.tsv", fill = TRUE)
#         V1         V2 V3               V4 V5 V6 V7
# 1: 1054434 01-01-2015 -1 AMOUNT OWN MUSIC 12 NA NA
# 2: 1054434 01-01-2015 -1             DVDS  2 NA NA
# 3: 1054434 01-01-2015 -1          INIT TV  2 NA NA
# 4: 1054434 01-01-2015 -1            INIT2  4 NA NA
# 5: 1054434 01-01-2015 -1   Intro_other_TV  2 NA NA

test.tsv 是您的文件。

除此之外,您可以使用命令行工具来修剪尾随空格;我对sed 不太友好,所以我使用this 问题作为参考:

fread("sed 's/[ \t]*$//' test.tsv")
#         V1         V2 V3               V4 V5
# 1: 1054434 01-01-2015 -1 AMOUNT OWN MUSIC 12
# 2: 1054434 01-01-2015 -1             DVDS  2
# 3: 1054434 01-01-2015 -1          INIT TV  2
# 4: 1054434 01-01-2015 -1            INIT2  4
# 5: 1054434 01-01-2015 -1   Intro_other_TV  2

最后一个选择是将双 \t 替换为单个 \t 列,以防您想要一列 NA:

fread("sed 's/[ \t][ \t]$/\t/' ~/Desktop/test.tsv")
#         V1         V2 V3               V4 V5 V6
# 1: 1054434 01-01-2015 -1 AMOUNT OWN MUSIC 12 NA
# 2: 1054434 01-01-2015 -1             DVDS  2 NA
# 3: 1054434 01-01-2015 -1          INIT TV  2 NA
# 4: 1054434 01-01-2015 -1            INIT2  4 NA
# 5: 1054434 01-01-2015 -1   Intro_other_TV  2 NA

【讨论】:

  • 感谢 Michael,sed 是一个非常有趣的功能。不幸的是,我无法让它在我的计算机上运行......我最终设法从 GitHub 安装了 data.table 1.9.7,但这涉及到恢复到 R.3.2.2。并安装 Rtools32。当额外的列位于文件的开头时,fill=TRUE 可以完美地工作,但当它们开始出现在文件中更远的行中时就不行了...
  • @chrisjacques 以上适用于您的示例;您必须区分当前示例和实际文件之间的差异,以便我提供进一步帮助
【解决方案2】:

你可以这样做

read.table(filenames[1],fill=TRUE)

【讨论】:

    猜你喜欢
    • 2015-12-30
    • 2014-10-28
    • 2015-10-23
    • 2018-02-11
    • 2017-11-26
    • 1970-01-01
    • 2020-08-23
    • 2013-07-09
    相关资源
    最近更新 更多