首页 > 解决方案 > read_csv() 将“\r”添加到 *.csv 输入

问题描述

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

来自 EdX.org 的一个小 (17kb) csv 文件

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-Rread.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”字符串不存在?

如果可能的话,我宁愿不必单独指定每一列的类型。

标签: rcsvtidyversereadr

解决方案


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

加载数据后,您可以自己删除它们:

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

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


推荐阅读