7

可以fread从“data.table”强制成功"."用作sep值吗?

我正在尝试使用"splitstackshape"fread来加速我的concat.split功能。请参阅此 Gist了解我正在采用的一般方法,以及此问题了解我为什么要进行切换。

我遇到的问题是将点 ( ".") 视为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”字符)。我知道使用 a"."作为分隔符并不是最好的主意,但我只是想根据在 SO 上回答的其他 问题来解释其他用户在他们的数据集中可能有什么。

4

2 回答 2

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")

这确保不会有歧义。

于 2014-11-12T21:22:04.500 回答
0

问题接缝与文本本身的数值有关:

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>
于 2013-10-08T05:21:08.720 回答