在 R 中处理字节顺序标记 (BOM)
Dealing with Byte Order Mark (BOM) in R
有时,字节顺序标记 (BOM) 会出现在 .CSV 文件的开头。当您使用记事本或 Excel 打开文件时,该符号不可见,但是,当您使用各种方法在 R 中读取文件时,您将在第一列的名称中看到不同的符号。这是一个例子
一个以 BOM 开头的示例 csv 文件。
ID,title,clean_title,clean_title_id
1,0 - 0,,0
2,"""0 - 1,000,000""",,0
27448,"20yr. rope walker
igger",Rope Walker Igger,1832700817
通读 read.csv
基础 R 包
(x1 = read.csv("file1.csv",stringsAsFactors = FALSE))
# ï..ID raw_title semi_clean semi_clean_id
# 1 1 0 - 0 0
# 2 2 "0 - 1,000,000" 0
# 3 27448 20yr. rope walker\nigger Rope Walker Igger 1832700817
通读 data.table 包中的 fread
(x2 = data.table::fread("file1.csv"))
# ID raw_title semi_clean semi_clean_id
# 1: 1 0 - 0 0
# 2: 2 ""0 - 1,000,000"" 0
# 3: 27448 20yr. rope walker\rigger Rope Walker Igger 1832700817
正在读取 readr 包中的 read_csv
(x3 = readr::read_csv("file1.csv"))
# <U+FEFF>ID raw_title semi_clean semi_clean_id
# 1 1 0 - 0 <NA> 0
# 2 2 "0 - 1,000,000" <NA> 0
# 3 27448 20yr. rope walker\rigger Rope Walker Igger 1832700817
您可以注意到变量名称 ID 前面的不同字符。
这是当你运行 在所有这些
上命名时的结果
names(x1)
# [1] "ï..ID" "raw_title" "semi_clean" "semi_clean_id"
names(x2)
# [1] "ID" "raw_title" "semi_clean" "semi_clean_id"
names(x3)
# [1] "ID" "raw_title" "semi_clean" "semi_clean_id"
在x3
中,ID
前面没有'visible',但是当你勾选
names(x3)[[1]]=="ID"
# [1] FALSE
如何在每种情况下摆脱这些不需要的字符。
PS: 请补充更多读取csv文件的方法,遇到的问题及解决办法
对于 read.csv 在 base R 中使用:
x1 = read.csv("file1.csv",stringsAsFactors = FALSE, fileEncoding = "UTF-8-BOM")
对于恐惧,使用:
x2 = fread("file1.csv")
setnames(x2, "ID", "ID")
对于read_csv,使用:
x3 = readr::read_csv("file1.csv")
setDT(X3) #convert into data tables, so that setnames can be used
setnames(x3, "\uFEFFID", "ID")
一种非基于 R 的解决方案是在 Notepad++ 中打开文件,将编码更改为 "Encoding in UTF-8 without BOM"
后保存文件
有时,字节顺序标记 (BOM) 会出现在 .CSV 文件的开头。当您使用记事本或 Excel 打开文件时,该符号不可见,但是,当您使用各种方法在 R 中读取文件时,您将在第一列的名称中看到不同的符号。这是一个例子
一个以 BOM 开头的示例 csv 文件。
ID,title,clean_title,clean_title_id
1,0 - 0,,0
2,"""0 - 1,000,000""",,0
27448,"20yr. rope walker
igger",Rope Walker Igger,1832700817
通读 read.csv
基础 R 包
(x1 = read.csv("file1.csv",stringsAsFactors = FALSE))
# ï..ID raw_title semi_clean semi_clean_id
# 1 1 0 - 0 0
# 2 2 "0 - 1,000,000" 0
# 3 27448 20yr. rope walker\nigger Rope Walker Igger 1832700817
通读 data.table 包中的 fread
(x2 = data.table::fread("file1.csv"))
# ID raw_title semi_clean semi_clean_id
# 1: 1 0 - 0 0
# 2: 2 ""0 - 1,000,000"" 0
# 3: 27448 20yr. rope walker\rigger Rope Walker Igger 1832700817
正在读取 readr 包中的 read_csv
(x3 = readr::read_csv("file1.csv"))
# <U+FEFF>ID raw_title semi_clean semi_clean_id
# 1 1 0 - 0 <NA> 0
# 2 2 "0 - 1,000,000" <NA> 0
# 3 27448 20yr. rope walker\rigger Rope Walker Igger 1832700817
您可以注意到变量名称 ID 前面的不同字符。
这是当你运行 在所有这些
上命名时的结果names(x1)
# [1] "ï..ID" "raw_title" "semi_clean" "semi_clean_id"
names(x2)
# [1] "ID" "raw_title" "semi_clean" "semi_clean_id"
names(x3)
# [1] "ID" "raw_title" "semi_clean" "semi_clean_id"
在x3
中,ID
前面没有'visible',但是当你勾选
names(x3)[[1]]=="ID"
# [1] FALSE
如何在每种情况下摆脱这些不需要的字符。 PS: 请补充更多读取csv文件的方法,遇到的问题及解决办法
对于 read.csv 在 base R 中使用:
x1 = read.csv("file1.csv",stringsAsFactors = FALSE, fileEncoding = "UTF-8-BOM")
对于恐惧,使用:
x2 = fread("file1.csv")
setnames(x2, "ID", "ID")
对于read_csv,使用:
x3 = readr::read_csv("file1.csv")
setDT(X3) #convert into data tables, so that setnames can be used
setnames(x3, "\uFEFFID", "ID")
一种非基于 R 的解决方案是在 Notepad++ 中打开文件,将编码更改为 "Encoding in UTF-8 without BOM"
后保存文件