1 中文乱码问题

  • 在Rstudio中,用 Import Dataset 导入,选择from Excel,利用readxl包导入excel 文件。
  • 若Excel导入出现乱码,转换成 csv 尝试。将Excel文件另存为 csv 文件,csv文件的存放路径避免中文字符。在Rstudio中,用 Import Dataset 导入,选择from text(readr),导入 csv 文件。
  • 若选中csv文件后显示乱码,尝试在Import Options中按Locale-Configure-Encoding-Other路径,键入GBK解决,或直接在代码中修改编码方式。

    1. guess_encoding("example.csv")
    2. df <- read_csv("~/input/example.csv", locale = locale(encoding = "GBK"))
  • 若仍显示乱码,尝试将 csv 文件用 windows 记事本打开,重新另存为,此时可选择编码方式为utf-8,将另存后的 csv 文件按以上方式重新导入。

  • 若csv文件中的字符串包含逗号时, 为避免逗号分隔符识别错位,使用read_csv(x, quote = “‘“)。
  • R数据导出csv 文件时,为避免中文乱码,选择write_excle_csv而非write_csv。

    1. df %>% write_excel_csv("output/example.csv")
  • R数据导出 excel 文件时,可使用 openxlxs 包设定导出风格。

2 类型转换错误:no trailing characters

  • readr导入数据时会自动转换类型,出现类型转换错误时,用problems 查找问题列,针对性修改 col_types

    1. df <- read_csv("example.csv")
    2. # 出现no trailing characters问题时,查找存在类型转换错误的列
    3. problems(df) %>% select(col) %>% distinct()
    4. # 例如y列类型转换错误(如前 1000 列均为na值),自动转化为col_logical(),可尝试调整为col_character()
    5. 或其他类型再次尝试导入
    6. df <- read_csv(
    7. "example.csv",
    8. col_types = cols(
    9. x = col_double(),
    10. y = col_character(),
    11. z = col_skip()
    12. )
    13. )
  • 将类型先统一转换成character后,再进行类型转换

    1. df <- read_csv("example.csv",
    2. col_types = cols(.default = col_character())
    3. ) %>% type_convert()
  • 利用data.table::fread读取数据(不自动转换类型),再转化成 tibble 格式

    1. df <- fread("example.csv") %>% as.tibble()

3 导入建议

为避免类型转换错误、减少不必要的列导入,建议导入时修改col_types参数。

  1. # 查看readr默认列类型,将cols_condense(df_spec)的列类型复杂到col_types中修改,col_skip()表明需舍弃的字段
  2. spec_csv("example.csv") %>% cols_condense()
  3. df <- read_csv(
  4. "example.csv",
  5. col_types = cols(
  6. x = col_double(),
  7. y = col_character(),
  8. z = col_skip()
  9. )
  10. )
  11. # 最佳建议
  12. # --------------------
  13. # 若显示字段不完整,可以尝试以下方式获得完整列类型
  14. spec_csv("example.csv") %>% str()
  15. # col_only仅保留申明的变量,舍弃其他变量
  16. df <- read_csv(
  17. "example.csv",
  18. col_types = cols_only(
  19. x = col_double(),
  20. y = col_character()
  21. )
  22. )