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 文件)。
我正在尝试读取来自 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 文件)。