如何让"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
”字符)。我知道使用“.”作为分隔符不是最好的选择,但我只是想考虑其他用户可能在他们的数据集中有什么,基于我在SO上回答过的其他 问题 链接。
fread
的源代码,所以不想问显而易见的问题,但是你尝试过转义\\.
了吗? - Ricardo SaportaError in fread(x1, sep = "\\.", header = FALSE) : 'sep' must be 'auto' or a single character
。 - A5C1D2H2I1M1N2O1R2T1fread
会支持像read.table
一样的text
参数 :) - A5C1D2H2I1M1N2O1R2T1z <- gsub(“。”,“|||||”,y,fixed = TRUE)
使您的解决方法更加健壮。fread(x2,sep =“|||||”,header = FALSE)
- Dean MacGregor