来自“data.table”的fread
是否可以强制成功使用"."
作为sep
值?
我正在尝试使用fread
来加速"splitstackshape"中的concat.split
个功能。请参阅this Gist了解我正在采取的一般方法,并this question了解我想要切换的原因。
我遇到的问题是将点("."
)视为sep
的值。每当我这样做时,我都会收到“意外字符”错误。
以下简化示例演示了此问题。
library(data.table)
y <- paste("192.168.1.", 1:10, sep = "")
x1 <- tempfile()
writeLines(y, x1)
fread(x1, sep = ".", header = FALSE)
# Error in fread(x1, sep = ".", header = FALSE) : Unexpected character (
# 192) ending field 2 of line 1
我当前功能中的解决方法是将"."
替换为原始数据中希望不存在的另一个字符,例如"|"
,但这似乎对我有风险,因为我不能预测别人的数据集中的内容。这是实施中的解决方法。
x2 <- tempfile()
z <- gsub(".", "|", y, fixed=TRUE)
writeLines(z, x2)
fread(x2, sep = "|", header = FALSE)
# V1 V2 V3 V4
# 1: 192 168 1 1
# 2: 192 168 1 2
# 3: 192 168 1 3
# 4: 192 168 1 4
# 5: 192 168 1 5
# 6: 192 168 1 6
# 7: 192 168 1 7
# 8: 192 168 1 8
# 9: 192 168 1 9
# 10: 192 168 1 10
出于此问题的目的,假设数据是平衡的(每行将具有相同数量的“sep
”字符)。我知道使用"."
作为分隔符不是最好的主意,但我只是想根据other {{3}考虑其他用户在其数据集中可能包含的内容。 } questions来自SO。
答案 0 :(得分:3)
现在在GitHub上的v1.9.5中实现。
> input = paste( paste("192.168.1.", 1:5, sep=""), collapse="\n")
> cat(input,"\n")
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
设置sep='.'
会导致新参数dec
(默认为'.'
)模糊不清:
> fread(input,sep=".")
Error in fread(input, sep = ".") :
The two arguments to fread 'dec' and 'sep' are equal ('.')
因此为dec
选择其他内容:
> fread(input,sep=".",dec=",")
V1 V2 V3 V4
1: 192 168 1 1
2: 192 168 1 2
3: 192 168 1 3
4: 192 168 1 4
5: 192 168 1 5
您可能会收到警告:
> fread(input,sep=".",dec=",")
V1 V2 V3 V4
1: 192 168 1 1
2: 192 168 1 2
3: 192 168 1 3
4: 192 168 1 4
5: 192 168 1 5
Warning message:
In fread(input, sep = ".", dec = ",") :
Run again with verbose=TRUE to inspect... Unable to change to a locale
which provides the desired dec. You will need to add a valid locale name
to getOption("datatable.fread.dec.locale"). See the paragraph in ?fread.
忽略或取消警告,或阅读段落并设置选项:
options(datatable.fread.dec.locale = "fr_FR.utf8")
这可以确保不存在歧义。
答案 1 :(得分:0)
&LT;这是一个很长的评论,而不是答案&gt;
问题接缝与文本本身的数值有关。
library(data.table)
y <- paste("Hz.BB.GHG.", 1:10, sep = "")
xChar <- tempfile()
writeLines(y, xChar)
fread(xChar, sep = ".", header = FALSE)
# V1 V2 V3 V4
# 1: Hz BB GHG 1
# 2: Hz BB GHG 2
# 3: Hz BB GHG 3
# 4: Hz BB GHG 4
# 5: Hz BB GHG 5
# 6: Hz BB GHG 6
# 7: Hz BB GHG 7
# 8: Hz BB GHG 8
# 9: Hz BB GHG 9
# 10: Hz BB GHG 10
然而,尝试使用原始值,再次给出相同的错误
fread(x1, sep = ".", header = FALSE, colClasses="numeric", verbose=TRUE)
fread(x1, sep = ".", header = FALSE, colClasses="character", verbose=TRUE)
Detected eol as \n only (no \r afterwards), the UNIX and Mac standard.
Looking for supplied sep '.' on line 10 (the last non blank line in the first 'autostart') ... found ok
Found 4 columns
First row with 4 fields occurs on line 1 (either column names or first row of data)
Error in fread(x1, sep = ".", header = FALSE, colClasses = "character", :
Unexpected character (192.) ending field 2 of line 1
然而,这确实有效:
read.table(x1, sep=".")
# V1 V2 V3 V4
# 1 192 168 1 1
# 2 192 168 1 2
# 3 192 168 1 3
# 4 192 168 1 4
# ... <cropped>