rio packagerio是一个比较简单,但是又非常强大的一个数据读写包,这个包的特点是:根据文件的拓展名推断文件的类型,然后调用不同的包来读写数据,目前支持的文件类型
主要使用的函数有:
import和import_listexport和export_listconvertimportimport函数的用法:
import(file, format, setclass, which, ...)
file指定文件名format 一般是根据文件名来推断文件类型,但是也可以通过这个参数来指定文件类型setclass 指定读入数据后返回的数据类型,默认是data.frame,可以更改为"tbl_df","tbl","tibble","data.table"which 当我们需要从含有多个数据对象的文件中读取数据时可以指定这个参数;比如file是一个压缩的文件夹,可以使用该参数来指定需要读取的文件;如果是一个excel表格(含有多个子表格),可以使用which指定读取的表格;如果是一个Rdata文件也可以指定需要读取的对象当我们在一个文件夹下有多个文件,可以使用import_list函数来一次性读入:
list.files("./files_list/")
#[1] "ACC_simulation.rds" "BLCA_simulation.rds" "BRCA_simulation.rds"
dt <- import_list(file =paste0("./files_list/",dir("files_list/")),rbind = T)
exportexport函数的用法为:
export(x, file, format, ...)
x 数据框或者矩阵file 保存的文件名format 保存的文件格式(文件拓展名);file和format至少要指定一个也可以使用export将多个对象输出到一个文件中(excel和Rdata):
##export
export(iris,file = "iris.csv")
# export to sheets of an Excel workbook
export(list(mtcars = mtcars, iris = iris), "multi.xlsx")
# export to an .Rdata file
## as a named list
export(list(mtcars = mtcars, iris = iris), "multi.rdata")
## as a character vector
export(c("mtcars", "iris"), "multi2.rdata")
而export_list可以将多个对象输出为多个文件:
export_list(list(mtcars = mtcars, iris = iris), "%s.tsv")
convertconvert函数是import和export函数的包装,可以直接将一种格式的文件转化成另一种格式的文件
convert(in_file = "iris.csv",out_file = "iris.tsv")
readr packagereadr包主要有7个函数用来进行数据的读入:
read_csv(): comma separated (CSV) filesread_tsv(): tab separated filesread_delim(): general delimited filesread_fwf(): fixed width filesread_table(): tabular files where columns are separated by white-space.read_log(): web log files和base R的read.*函数相比,readr包的read_*函数的特点有:
tibbles,不会将字符变量转化为因子;可以自动的解析常见的时间格式
5-1-1
readr将文件解析成tibble分成3个步骤:
向量解析使用parse_*函数,将字符向量转化为特定类型的向量
parse_integer(c("1", "2", "3"))
#> [1] 1 2 3
parse_double(c("1.56", "2.34", "3.56"))
#> [1] 1.56 2.34 3.56
parse_logical(c("true", "false"))
#> [1] TRUE FALSE
readr默认.作为小数点,,作为分节号(group marker),可以使用locale()来更改:
parse_double(c("1,56", "2,34", "356"),locale=locale(decimal_mark = ","))
使用parse_number可以更灵活的解析字符到数字:
parse_number(c("0%", "10%", "150%"))
#> [1] 0 10 150
parse_number(c("$1,234.5", "$12.45"))
#> [1] 1234.50 12.45
readr也支持日期,时间数据的解析,有3个函数:
parse_datetime() ISO8601parse_date()parse_time()parse_datetime("2010-10-01T2010")
#> [1] "2010-10-01 20:10:00 UTC"
# If time is omitted, it will be set to midnight
parse_datetime("20101010")
#> [1] "2010-10-10 UTC"
parse_date("2010-10-01")
#> [1] "2010-10-01"
library(hms)
parse_time("01:10 am")
#> 01:10:00
parse_time("20:10:01")
#> 20:10:01
readr使用启发式的方法来猜测每一列的数据类型,使用的函数是guess_parser:
guess_parser(c("a", "b", "c"))
#> [1] "character"
guess_parser(c("1", "2", "3"))
#> [1] "double"
guess_parser(c("1,000", "2,000", "3,000"))
#> [1] "number"
guess_parser(c("2001/10/10"))
#> [1] "date"
在读入文件的时候可以使用col_type来人为指定列的类型
可以通过spec_**函数来查看数据读入过程中的列类型判断:
x <- spec_csv(readr_example("challenge.csv"))
#>
#> ── Column specification ────────────────────────────────────────────────────────
#> cols(
#> x = col_double(),
#> y = col_logical()
#> )
当使用readr的7个函数读入数据时,这些函数会先读入字符矩阵,然后调用spec_*函数来决定每列的数据类型,最后根据这个类型来解析每一列:
df2 <- read_csv("iris.csv")
# Parsed with column specification:
# cols(
# Sepal.Length = col_double(),
# Sepal.Width = col_double(),
# Petal.Length = col_double(),
# Petal.Width = col_double(),
# Species = col_character()
# )
当readr猜列的数据类型时是先读入前1000行,然后根据这1000行来决定列的数据类型:
challenge <- read_csv(readr_example("challenge.csv"))
#>
#> ── Column specification ────────────────────────────────────────────────────────
#> cols(
#> x = col_double(),
#> y = col_logical()
#> )
#> Warning: 1000 parsing failures.
#> row col expected actual file
#> 1001 y 1/0/T/F/TRUE/FALSE 2015-01-16 '/Users/runner/work/_temp/Library/readr/extdata/challenge.csv'
#> 1002 y 1/0/T/F/TRUE/FALSE 2018-05-18 '/Users/runner/work/_temp/Library/readr/extdata/challenge.csv'
#> 1003 y 1/0/T/F/TRUE/FALSE 2015-09-05 '/Users/runner/work/_temp/Library/readr/extdata/challenge.csv'
#> 1004 y 1/0/T/F/TRUE/FALSE 2012-11-28 '/Users/runner/work/_temp/Library/readr/extdata/challenge.csv'
#> 1005 y 1/0/T/F/TRUE/FALSE 2020-01-13 '/Users/runner/work/_temp/Library/readr/extdata/challenge.csv'
#> .... ... .................. .......... ..............................................................
#> See problems(...) for more details.
###使用problem查看问题
problems(challenge)
#> # A tibble: 1,000 x 5
#> row col expected actual file
#> <int> <chr> <chr> <chr> <chr>
#> 1 1001 y 1/0/T/F/TRUE/F… 2015-01… '/Users/runner/work/_temp/Library/readr/…
#> 2 1002 y 1/0/T/F/TRUE/F… 2018-05… '/Users/runner/work/_temp/Library/readr/…
#> 3 1003 y 1/0/T/F/TRUE/F… 2015-09… '/Users/runner/work/_temp/Library/readr/…
#> 4 1004 y 1/0/T/F/TRUE/F… 2012-11… '/Users/runner/work/_temp/Library/readr/…
#> 5 1005 y 1/0/T/F/TRUE/F… 2020-01… '/Users/runner/work/_temp/Library/readr/…
#> 6 1006 y 1/0/T/F/TRUE/F… 2016-04… '/Users/runner/work/_temp/Library/readr/…
#> # … with 994 more rows
这个challenge数据集的第二列前1000行是NA,所以readr认为它是逻辑值,这个时候我们可以指定列的类型(col_types)或者增多猜所依据的行数(guess_max):
challenge <- read_csv(
readr_example("challenge.csv"),
col_types = cols(
x = col_double(),
y = col_date()
)
)
challenge2 <- read_csv(readr_example("challenge.csv"), guess_max = 1001)
#>
#> ── Column specification ────────────────────────────────────────────────────────
#> cols(
#> x = col_double(),
#> y = col_date(format = "")
#> )
也可以将数据全部以字符形式读入,然后再使用type_convert进行转化(这个时候如果没有指定列的类型,是根据所有的行进行推测的):
challenge2 <- read_csv(readr_example("challenge.csv"),
col_types = cols(.default = col_character())
)
type_convert(challenge3) -> a
# Parsed with column specification:
# cols(
# x = col_double(),
# y = col_date(format = "")
# )
readr使用write_*函数来输出文件
当使用write_csv或者write_tsv等函数时,指定的列的类型会丢失(再次读入时还需要指定):
write_csv(challenge, "challenge-2.csv")
read_csv("challenge-2.csv")
# Parsed with column specification:
# cols(
# x = col_double(),
# y = col_logical()
# )
# Warning: 1000 parsing failures.
# row col expected actual file
# 1001 y 1/0/T/F/TRUE/FALSE 2015-01-16 'challenge-2.csv'
# 1002 y 1/0/T/F/TRUE/FALSE 2018-05-18 'challenge-2.csv'
# 1003 y 1/0/T/F/TRUE/FALSE 2015-09-05 'challenge-2.csv'
# 1004 y 1/0/T/F/TRUE/FALSE 2012-11-28 'challenge-2.csv'
# 1005 y 1/0/T/F/TRUE/FALSE 2020-01-13 'challenge-2.csv'
# .... ... .................. .......... .................
# See problems(...) for more details.
#
# # A tibble: 2,000 x 2
# x y
# <dbl> <lgl>
# 1 404 NA
# 2 4172 NA
# 3 3004 NA
# 4 787 NA
# 5 37 NA
# 6 2332 NA
# 7 2489 NA
# 8 1449 NA
# 9 3665 NA
# 10 3863 NA
# # ... with 1,990 more rows
把文件保存为rds或者feather文件就不会出现这种问题:
write_rds(challenge, "challenge.rds")
read_rds("challenge.rds")
#> # A tibble: 2,000 x 2
#> x y
#> <dbl> <date>
#> 1 404 NA
#> 2 4172 NA
#> 3 3004 NA
#> 4 787 NA
#> 5 37 NA
#> 6 2332 NA
#> # … with 1,994 more rows
##feather可以被python使用
library(feather)
write_feather(challenge, "challenge.feather")
read_feather("challenge.feather")
#> # A tibble: 2,000 x 2
#> x y
#> <dbl> <date>
#> 1 404 <NA>
#> 2 4172 <NA>
#> 3 3004 <NA>
#> 4 787 <NA>
#> 5 37 <NA>
#> 6 2332 <NA>
#> # ... with 1,994 more rows
##python input
import feather
path = 'data/co2.feather'
df_co2_feather = feather.read_dataframe(path)