tidyverse包与数据清洗

tidyverse包与数据清洗,第1张

author: 丁争强
date:3022/5/16

前言

R语言在分析处理数据中占有优势,但很多同学并不知道该如何开始。最近在学习中发现一点心得供大家参考。

tidyverse简介

tidyverse在使用R语言进行数据分析时是不可避免要使用的包。在学习R语言的时候不妨放弃base R,直接使用tidyverse等经典数据分析包。

函数读写 readr 包读写带分隔符的文本文件

如 csv读入数据到数据框: read_csv()

#read_csv
#read_csv(file, col_names, col_types, locale, skip, na, n_max, …)

file : 数据文件所在相对或绝对路径、网址、压缩包、批量文件路径等
col_names : 第一行是否作为列名
skip:开头跳过的行数
na : 设置什么值解读为缺失值
n_max : 读取的最大行数
col_select :支持 dplyr 选择列语法选择要读取的列
locale : 设置区域语言环境(时区,编码方式,小数标记、日期格式),主要是用来设置所读取数据文件的编码方式,如从默认 “UTF-8” 编码改为 “GBK” 编码: locale = locale(encoding = “GBK”)

读excel文件

readxl 包专门读取 Excel 文件,包括同一个工作簿中的不同工作表:read_excel() : 自动检测 xls 或 xlsx 文件

read_xlsx(path, sheet, range, col_names, col_types, skip, na, n_max,)

path : 数据文件所在相对或绝对路径
sheet : 要读取的工作表
range : 要读取的单元格范围
col_names : 第一行是否作为列名

文件合并

依靠强大的强大的purrr包,也可以用base R循环读取,不过少量的工作簿可以,工作簿较多时就不太现实. 这一部分对大部分在校同学用处不大。一部分学生干部在收集需要汇总的信息时可以使用

合并工作簿
files = fs::dir_ls("datas/read_datas", recurse = TRUE, glob ="*.xlsx")
#files
#glob 过滤路径

dir_ls该函数返回了当前目录(工作目录)的文件清单。接下来我们对该文件目录下的xlsx文件进行合并。接着,用 map_dfr() 在该路径向量上做迭代,应用read_xlsx()到每个文件路径,再默认按行合并。“.id”增加一列数据是从那个文件来的

library(readxl)
df = readxl::map_dfr(files, read_xlsx, .id = " 来源 ")
# ".id"可以不加
# 所有文件按照行进行拼接,并储存在df数据框中,
write_xlsx("path//df.xlsx")
读取文件时遭遇的中文乱码

一般来说国际通用UTF-8格式,但是有的作者在输出文件时默认使用了GBK格式,在R中读取时会使中文乱码

# 用GBK读取文本文件
read_csv("datas/bp-gbk.csv",locale = locale(encoding="GBK")) 

所以在写出文件时一般使用UTF-8写出,方便数据的使用者进行代码项目再现。 base R 一般默认GBK格式,而包默认UTF-8格式

readr::write_excel_csv(df, "file-BOM-UTF8.csv")

base R 需要手动调整格式

write.csv(df, "file-UTF8.csv",fileEncoding = "UTF-8") 
数据链接

整体上可大致分为四中链接。左连接,右链接,内连接,外连接 不做赘述。感兴趣同学可自行在学习SQL语句中学习了解。

合并行列

用 dplyr 包中的 bind_rows() 和 bind_cols() 实现。
数据集为R中自带数据集,"::"由于我们在编程时会调用多个包。每个包中的函数名称有可能相同。::符号则起到了指定用某个包中的函数

# 按行拼接
dplyr::bind_rows(sample_n(iris, 2),sample_n(iris, 2),sample_n(iris, 2))
#在使用包中函数时建议使用:: 保持代码的可读性
#按列拼接
one = mtcars[1:4, 1:3]
two = mtcars[1:4, 4:5]
dplyr::bind_cols(one, two)
拆分数据

一列变多列,多列变一列
一列变多列:

 separate(data, col, into, sep, ...)
# col : 要拆分的列
# into : 拆开的新列,
# sep : 指定根据什么分隔符拆分
# test %>% separate(rate, into = c("cases", "population"), sep = "/",convert = TRUE) 
# 使用了tidyverse的管道 *** 作,,管道将 %>% 前面的数据返回给 %>% 后面函数的第一个参数。同时讲新列数据转化为数值型

多列变一列

# 用 unite() 函数来合并列,其基本语法为:
unite(data, col, sep, ...)
# col : 要合并的列
# sep : 指定合并各列添加的分隔符
# table5 %>%
# unite(new, century, year, sep = "")
# 将century, year合并为new,指定分隔符为空

全篇过程为数据分析师拿到半结构化数据绝对会遇到的调整过程。后续过程作者将在学习过程中与大家分享。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/956943.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-18
下一篇 2022-05-18

发表评论

登录后才能评论

评论列表(0条)

保存