r - read_csv() 将“\r”添加到 *.csv 输入
问题描述
我正在尝试从 EdX.org 读取一个小的 (17kb)、简单的 csv 文件(用于在线课程),而我以前从未遇到过这个问题readr::read_csv()
。Base-Rread.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”字符串不存在?
如果可能的话,我宁愿不必单独指定每一列的类型。
解决方案
简而言之,字符在文件中(可能是偶然的)并且read_csv
不自动删除它们是正确的:因为它们出现在引号内,这按照惯例意味着 CSV 解析器应该按原样处理字段,而不是删除空白字符。read.csv
这样做是错误的,这可以说是一个错误。
加载数据后,您可以自己删除它们:
df = mutate_if(df, is.character, ~ stringr::str_remove_all(.x, '\r'))
这对于这个文件来说似乎已经足够好了,但总的来说,我会担心文件可能会以其他方式损坏,因为这些字符的存在显然不是故意的,并且文件不遵循通用的文件结尾约定(它是既不是传统的 Windows 文件也不是 Unix 文件)。
推荐阅读
- python-3.x - 是否可以从 topview tkinter 窗口获取输入并从主 tk 窗口中检索保存的输入字段值
- floating-point - 将二进制任意精度浮点数转换为任何基数
- powershell - Powershell 将输出变量导出到文件未找到
- unity3d - Unity2D - 为什么我的纵横比搞砸了,我该如何解决?
- xml - 在谷歌应用脚本中使用 XmlService.Parse 设置 DOCTYPE
- firebase - firebase.messaging.deleteToken() 删除令牌时失败
- c++ - 如何在vulkan中处理动态数量的draw call
- javascript - 当我在 atom 中编写 JavaScript 时,它的颜色变成了白色,现在所有其他代码也变成了白色
- mysql - 如何在 mysql 和 nodejs 中将登录凭据与用户数据分开?
- java - 如何使用 Instrumentation 的 Java API 捕获 HTTP 请求和响应?