read_csv() 将“\r”添加到 *.csv 输入

read_csv() adds "\r" to *.csv input

我正在尝试读取来自 EdX.org 的一个小的 (17kb)、简单的 csv 文件(用于在线课程),我以前从未遇到过 readr::read_csv() 的问题。 Base-R read.csv() 读取文件而不产生问题。

A small (17kb) csv file from EdX.org

library(tidyverse)
df <- read_csv("https://courses.edx.org/assets/courseware/v1/ccdc87b80d92a9c24de2f04daec5bb58/asset-v1:MITx+15.071x+1T2020+type@asset+block/WHO.csv")
head(df)

给出这个输出

#> # A tibble: 6 x 13
#>   Country Region Population Under15 Over60 FertilityRate LifeExpectancy
#>   <chr>   <chr>       <dbl>   <dbl>  <dbl> <chr>                  <dbl>
#> 1 Afghan… Easte…      29825    47.4   3.82 "\r5.4\r"                 60
#> 2 Albania Europe       3162    21.3  14.9  "\r1.75\r"                74
#> 3 Algeria Africa      38482    27.4   7.17 "\r2.83\r"                73
#> 4 Andorra Europe         78    15.2  22.9  <NA>                      82
#> 5 Angola  Africa      20821    47.6   3.84 "\r6.1\r"                 51
#> 6 Antigu… Ameri…         89    26.0  12.4  "\r2.12\r"                75
#> # … with 6 more variables: ChildMortality <dbl>, CellularSubscribers <dbl>,
#> #   LiteracyRate <chr>, GNI <chr>, PrimarySchoolEnrollmentMale <chr>,
#> #   PrimarySchoolEnrollmentFemale <chr>

您会注意到 FertilityRate 列的值中添加了“\r”。我已经下载了 csv 文件,但在那里找不到它们。

Base-R read.csv() 读取文件没有问题,所以我想知道我使用 tidyverse read_csv().

有什么问题
head(df$FertilityRate)
#> [1] "\r5.4\r"  "\r1.75\r" "\r2.83\r" NA         "\r6.1\r"  "\r2.12\r"

如何修复我对 read_csv() 的使用,以便:“\r”字符串不存在?

如果可能,我希望不必单独指定每一列的类型。

简而言之,字符 在文件中(可能是偶然的)并且 read_csv 不自动删除它们是正确的:因为它们出现 在引号内,按照惯例,这意味着 CSV 解析器应该按原样处理字段,而不是去除空白字符。 read.csv 这样做是错误的,这可以说是一个错误。

您可以在加载数据后自行删除它们:

df = mutate_if(df, is.character, ~ stringr::str_remove_all(.x, '\r'))

这对于这个文件来说似乎已经足够好了,但总的来说我会担心文件可能会以其他方式损坏,因为这些字符的存在显然不是故意的,并且文件遵循不常见的文件结束约定(它既不是传统的 Windows 也不是 Unix 文件)。