使用相同的命令快速读取不同类型的数据,更好的分隔符猜测
Fast read different type of data with same command, better seperator guessing
我有 LD 数据,有时是来自 PLINK 的原始输出文件,如下所示(注意空格 - 用于使输出漂亮,还要注意前导和尾随空格):
write.table(read.table(text="
CHR_A BP_A SNP_A CHR_B BP_B SNP_B R2
1 154834183 rs1218582 1 154794318 rs9970364 0.0929391
1 154834183 rs1218582 1 154795033 rs56744813 0.10075
1 154834183 rs1218582 1 154797272 rs16836414 0.106455
1 154834183 rs1218582 1 154798550 rs200576863 0.0916789
1 154834183 rs1218582 1 154802379 rs11264270 0.176911 ",sep="x"),
"Type1.txt",col.names=FALSE,row.names=FALSE,quote=FALSE)
或者用制表符分隔的文件:
write.table(read.table(text="
CHR_A BP_A SNP_A CHR_B BP_B SNP_B R2
1 154834183 rs1218582 1 154794318 rs9970364 0.0929391
1 154834183 rs1218582 1 154795033 rs56744813 0.10075
1 154834183 rs1218582 1 154797272 rs16836414 0.106455
1 154834183 rs1218582 1 154798550 rs200576863 0.0916789
1 154834183 rs1218582 1 154802379 rs11264270 0.176911", sep=" "),
"Type2.txt",col.names=FALSE,row.names=FALSE,quote=FALSE,sep="\t")
read.csv 适用于两种类型的数据:
read.csv("Type1.txt", sep="")
read.csv("Type2.txt", sep="")
fread 仅适用于 Type2:
fread("Type1.txt")
fread("Type2.txt")
文件很大,有数百万行,因此不能使用 read.csv
选项。有没有办法让 fread
guess 更好?其他 package/function 个建议?
我可以使用 readLines
然后猜测文件的类型,或者使用系统调用整理文件然后 fread
,但这会增加我试图避免的开销。
编辑:会话信息
R version 3.2.0 (2015-04-16)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
你可以试试包readr。在 Cran 或 github.
上可用
如果对您有帮助,请阅读小插图。我发现它可以正确读取大多数 csv,包括日期,无需指定 stringsAsFactors = False。
但请阅读与 fread()
的比较
我不认为 fread
天生就有这种能力。然而,系统命令选项可以工作,额外的复制成本通常是值得的:
fread("powershell \"cat Type1.txt | % { $_ -replace ' +',',' } | % { $_ -replace '^,|,$','' }\"")
# CHR_A BP_A SNP_A CHR_B BP_B SNP_B R2
#1: 1 154834183 rs1218582 1 154794318 rs9970364 0.0929391
#2: 1 154834183 rs1218582 1 154795033 rs56744813 0.1007500
#3: 1 154834183 rs1218582 1 154797272 rs16836414 0.1064550
#4: 1 154834183 rs1218582 1 154798550 rs200576863 0.0916789
#5: 1 154834183 rs1218582 1 154802379 rs11264270 0.1769110
修复了开发版本,v1.9.5。使用 devel (/upgrade) 或等待一段时间使其以 v1.9.6 的形式命中 CRAN:
require(data.table) # v1.9.5+
ans <- fread("Type1.txt")
# CHR_A BP_A SNP_A CHR_B BP_B SNP_B R2
# 1: 1 154834183 rs1218582 1 154794318 rs9970364 0.0929391
# 2: 1 154834183 rs1218582 1 154795033 rs56744813 0.1007500
# 3: 1 154834183 rs1218582 1 154797272 rs16836414 0.1064550
# 4: 1 154834183 rs1218582 1 154798550 rs200576863 0.0916789
# 5: 1 154834183 rs1218582 1 154802379 rs11264270 0.1769110
fread()
在其他参数/错误修复中获得了 strip.white
(默认值=TRUE
)。有关详细信息,请参阅项目页面上的 README
文件。
类型也被正确识别。
sapply(ans, class)
# CHR_A BP_A SNP_A CHR_B BP_B SNP_B R2
# "integer" "integer" "character" "integer" "integer" "character" "numeric"
我有 LD 数据,有时是来自 PLINK 的原始输出文件,如下所示(注意空格 - 用于使输出漂亮,还要注意前导和尾随空格):
write.table(read.table(text="
CHR_A BP_A SNP_A CHR_B BP_B SNP_B R2
1 154834183 rs1218582 1 154794318 rs9970364 0.0929391
1 154834183 rs1218582 1 154795033 rs56744813 0.10075
1 154834183 rs1218582 1 154797272 rs16836414 0.106455
1 154834183 rs1218582 1 154798550 rs200576863 0.0916789
1 154834183 rs1218582 1 154802379 rs11264270 0.176911 ",sep="x"),
"Type1.txt",col.names=FALSE,row.names=FALSE,quote=FALSE)
或者用制表符分隔的文件:
write.table(read.table(text="
CHR_A BP_A SNP_A CHR_B BP_B SNP_B R2
1 154834183 rs1218582 1 154794318 rs9970364 0.0929391
1 154834183 rs1218582 1 154795033 rs56744813 0.10075
1 154834183 rs1218582 1 154797272 rs16836414 0.106455
1 154834183 rs1218582 1 154798550 rs200576863 0.0916789
1 154834183 rs1218582 1 154802379 rs11264270 0.176911", sep=" "),
"Type2.txt",col.names=FALSE,row.names=FALSE,quote=FALSE,sep="\t")
read.csv 适用于两种类型的数据:
read.csv("Type1.txt", sep="")
read.csv("Type2.txt", sep="")
fread 仅适用于 Type2:
fread("Type1.txt")
fread("Type2.txt")
文件很大,有数百万行,因此不能使用 read.csv
选项。有没有办法让 fread
guess 更好?其他 package/function 个建议?
我可以使用 readLines
然后猜测文件的类型,或者使用系统调用整理文件然后 fread
,但这会增加我试图避免的开销。
编辑:会话信息
R version 3.2.0 (2015-04-16)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
你可以试试包readr。在 Cran 或 github.
上可用如果对您有帮助,请阅读小插图。我发现它可以正确读取大多数 csv,包括日期,无需指定 stringsAsFactors = False。
但请阅读与 fread()
的比较我不认为 fread
天生就有这种能力。然而,系统命令选项可以工作,额外的复制成本通常是值得的:
fread("powershell \"cat Type1.txt | % { $_ -replace ' +',',' } | % { $_ -replace '^,|,$','' }\"")
# CHR_A BP_A SNP_A CHR_B BP_B SNP_B R2
#1: 1 154834183 rs1218582 1 154794318 rs9970364 0.0929391
#2: 1 154834183 rs1218582 1 154795033 rs56744813 0.1007500
#3: 1 154834183 rs1218582 1 154797272 rs16836414 0.1064550
#4: 1 154834183 rs1218582 1 154798550 rs200576863 0.0916789
#5: 1 154834183 rs1218582 1 154802379 rs11264270 0.1769110
修复了开发版本,v1.9.5。使用 devel (/upgrade) 或等待一段时间使其以 v1.9.6 的形式命中 CRAN:
require(data.table) # v1.9.5+
ans <- fread("Type1.txt")
# CHR_A BP_A SNP_A CHR_B BP_B SNP_B R2
# 1: 1 154834183 rs1218582 1 154794318 rs9970364 0.0929391
# 2: 1 154834183 rs1218582 1 154795033 rs56744813 0.1007500
# 3: 1 154834183 rs1218582 1 154797272 rs16836414 0.1064550
# 4: 1 154834183 rs1218582 1 154798550 rs200576863 0.0916789
# 5: 1 154834183 rs1218582 1 154802379 rs11264270 0.1769110
fread()
在其他参数/错误修复中获得了 strip.white
(默认值=TRUE
)。有关详细信息,请参阅项目页面上的 README
文件。
类型也被正确识别。
sapply(ans, class)
# CHR_A BP_A SNP_A CHR_B BP_B SNP_B R2
# "integer" "integer" "character" "integer" "integer" "character" "numeric"