R基础——数据的导入与导出(上)

在使用R做数据分析,首先需要从各种数据源中导入数据到R中,但导入过程中,总会出现各种问题。在这篇文章中,我将总结将csv文件导入至R的方法与遇到的问题及解决方法。

csv文件导入

csv是最常用的数据源格式,具有通用性与普遍性,导入csv文件到R也有众多方法。

  • 方法1:使用Rstudio导入

在R中的右侧pane中,有import dataset选项,如果安装了readr包,也提供了该包的图形界面操作。操作简单,但是有个问题,如果csv格式路径包含了中文,就会出现乱码,然后无法导入。该方法对国内用户支持不友好,如果想用此法导入数据的话,只能把csv文件重命名并放至纯英文的文件夹中。

  • 方法2:内置函数

R中内置了读入csv格式的函数:read.csv函数,该函数是由read.table函数改的特定函数,使用逗号作为分隔符,同时header与fill这两个参数默认为TRUE。

#读入csv文件
#把路径换成自己的文件路径
df <- read.csv("C:/Users/Administrator/Desktop/a文件.csv")
#read.csv2,适用于小数点为“,”的csv文件
df <- read.csv2("C:/Users/Administrator/Desktop/b文件.csv")
#小技巧,弹窗选择文件
df <- read.csv(file.choose())

使用内置函数导入csv文件,则不存在中文路径的问题,同时还提供了导入以小数点为“,”的csv文件。对于单一csv文件,使用file.choose函数进行图形界面选择,更加简单方便。

可能遇到的问题:导入中文csv文件,容易出现乱码。

#中文乱码处理
df <- read.csv(
  "C:/Users/Administrator/Desktop/a文件.csv", 
  fileEncoding = "GBK",  #指定文件的编码
  encoding = "GBK"  #指定编码
)

使用fileEncoding参数指定文件的编码,能解决大部分导入出现中文乱码的问题。如果导入后在R中显示出现乱码,增加encoding参数指定编码,也能解决大部分问题。

  • 方法3:使用readr包

readr包又是Hadley Wickham大神贡献的R包之一,相比于内置函数,readr包读入的速度更快。该包的函数与内置函数相对应,并以read_XXX形式命名。

#readr包
df.readr <- read_csv("C:/Users/Administrator/Desktop/a文件.csv")
#同样提供读入小数点为“,”的csv文件
df.readr <- read_csv2("C:/Users/Administrator/Desktop/a文件.csv")

readr包能够自动解析导入文件列的类型,这对于规整的数据来说很方便,但在我工作中,需要导入的文件常常有非法的字符,比如运费这一列,数据类型应该为数值型,但经常出现“--”这种字符串,表示无。readr包会将该值强制转换为NA,在后续的处理中,新增计算列的时候,比如销售总额 = 销售额+运费,则导致该值为NA,为了避免出现这类问题,我通常在导入数据的时候,设置为纯文本导入,然后再做处理。

#设置纯文本导入
df.readr <- read_csv(
  "C:/Users/Administrator/Desktop/a文件.csv",
  locale = locale(encoding = "GBK"),  #指定编码
  col_types = cols(.default = col_character())  #纯文本读入
)

同样的,如果出现中文乱码,使用locale参数设置编码。col_types参数设置各列的类型。

对于未知文件编码的csv文件,readr包提供了一个函数来判断文件编码。

#判断编码
> guess_encoding("C:/Users/Administrator/Desktop/a文件.csv")
# A tibble: 1 x 2
  encoding confidence
     <chr>      <dbl>
1    ASCII          1

返回一个数据框,encoding为文件编码,confidence是该编码的置信值,越高越有可能是这个编码。

  • 方法4:使用data.table包

data.table包是另一个处理数据的利器,对于GB级的数据更加高效。该包提供了一个函数读入csv文件,相比于上面几个方法,其速度是最快。

#data.table包
df.datatable <- fread("C:/Users/Administrator/Desktop/a文件.csv")
#指定编码
df.datatable <- fread("C:/Users/Administrator/Desktop/a文件.csv",encoding = "UTF-8")

fread函数提供的编码很少,”UTF-8“,”Latin-1“,默认是”unknown“,所以对中文的支持不太友好,在使用该函数的时候,建议把csv文件的编码转换为”UTF-8“。

csv文件导出

  • 方法1:内置函数

R提供了write.csv函数导出数据,该函数也是write.table函数的特定版。

#导出文件
write.csv(df, file = "C:/Users/Administrator/Desktop/导出文件.csv")
#与read.csv2对应
write.csv2(df, file = "C:/Users/Administrator/Desktop/导出文件.csv")
#指定编码
write.csv(
  df, file = "C:/Users/Administrator/Desktop/导出文件.csv",