【问题标题】:R read.table with UTF-8 encoded file reads infinity symbol as 8 (int)带有 UTF-8 编码文件的 R read.table 将无穷大符号读取为 8 (int)
【发布时间】:2019-06-28 13:13:27
【问题描述】:

我正在使用 read.table 读取 UTF-8 编码的数据文件。使用 'encoding="UTF-8"' 选项时,任何无穷大符号都被读取为数字 8。

不管它的价值,这是有问题的一行:

read.table(file.path(workingDir, "datafile.csv"), sep=",", blank.lines.skip=TRUE, allowEscapes=FALSE, header=TRUE, encoding="UTF-8")

文件的sn-p:

所有其他值都被正确读取,所以我很茫然。有什么想法吗?

【问题讨论】:

  • 如果你在 R 控制台中输入,它唯一的解释方式就是8。 R 将\U221E 理解为该符号,但您可能必须在导入之前将\U221E(或R 理解的Inf)交换。不确定是否有另一种方法来处理这个问题。如果您希望 R 将 理解为数学意义上的无穷大,您希望最终将值存储为 Inf/-Inf
  • 谢谢 Mako。我在 R Studio 中测试时注意到了这一点;我认为这几乎构成了一个错误?我遇到的问题是这是允许用户选择输入文件的应用程序的一部分。这些输入文件是用 Inf 创建的,但一些编辑器似乎将其更改为符号,因此它绕过了原始文件的创建。我真的想避免重新转换回 Inf,因为这些文件可能非常大(10 GB)。你知道在 R 中处理这种导入转换的优雅方式吗?
  • 一个更新,如果我用保存一个Excel文件,然后用readxl::read_excel读入它,它会正确显示符号。但是,如果我 dput 对象,它将转换为字符 8s
  • 不幸的是,strclass 没有告诉我任何解释为什么它正确显示符号的原因。
  • 我认为这需要深入了解 readxl 的编写方式,但它可能会给出一个小提示; dput 有一定的意义,因为它会转换为 ASCII,因此会丢失无穷大符号。也许,在底层,即使使用编码选项,r 也将 read.table 值存储为 ascii

标签: r utf-8 character-encoding


【解决方案1】:

这是 Windows 上 R 中的一个编码错误,正如您已在 r-devel 上报告的那样。

您可以执行以下解决方法:

使用 {readr} 读取您的数据(由于该错误,您不能在 R 中使用文字无穷大符号,而必须使用 unicode 转义 \u221E)。

library(readr)
(xdf <- read_csv("x, y\n\u221E, 2", col_types = cols(.default = col_character())))
#> # A tibble: 1 x 2
#>   x     y    
#>   <chr> <chr>
#> 1 ∞     2

这里我们在所有列中读取为字符(而不是数字),因为我们必须稍后将无穷大符号替换为Inf。有关如何指定列类型的详细信息,请参阅help(readr::cols())

现在将无穷大符号替换为 R 中无穷大的保留字 Inf 并转换为数字。我在这里使用来自 {stringr} 的str_replace(),但这也应该适用于base::gsub()

library(stringr) 
as.numeric(str_replace(xdf$x, pattern= "\u221E", replacement = "Inf"))
#> [1] Inf

如果您想对 data.frame 中的所有列执行此操作,您可以使用 dplyr 中的 mutate_all 函数执行此操作。

library(dplyr)
mutate_all(xdf, str_replace, pattern= "\u221E", replacement = "Inf") %>% 
  mutate_all(as.numeric)
#> # A tibble: 1 x 2
#>       x     y
#>   <dbl> <dbl>
#> 1   Inf     2

【讨论】:

    猜你喜欢
    • 2022-07-20
    • 2011-10-26
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2011-07-26
    • 2015-01-17
    相关资源
    最近更新 更多