gpt4 book ai didi

r - 在 "."中的 `fread` 中使用 sep = "data.table"

转载 作者:行者123 更新时间:2023-12-02 15:44:28 25 4
gpt4 key购买 nike

能否强制“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就在这里。

最佳答案

现已在 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")

这确保了不会出现歧义。

关于r - 在 "."中的 `fread` 中使用 sep = "data.table",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19239376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com