【发布时间】:2013-10-14 21:13:45
【问题描述】:
是否可以强制“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 questions I've answered 来解释其他用户在他们的数据集中可能拥有的内容。所以。
【问题讨论】:
-
我没怎么看
fread的来源,所以不要问显而易见的问题,但是您是否尝试过转义\\.? -
@RicardoSaporta,是的。你会得到一个错误:
Error in fread(x1, sep = "\\.", header = FALSE) : 'sep' must be 'auto' or a single character. -
我在发表评论后才注意到这一点。嗯...我不知道。也许@MattDowle 可以加入?
-
@RicardoSaporta,这就是我所希望的——然后我也可以问他
fread是否支持text参数,如read.table支持:) -
我不清楚这应该被读取为 4 列还是 2 列(双精度),但无论哪种方式似乎都是错误 - 提交错误报告?
标签: r data.table fread splitstackshape