数据处理神器tidyverse!教你如何秒速搞定数据处理!

news2024/11/15 7:06:25

一、前言

在R语言中,tidyverse是一个庞大的数据分析生态系统,它由一系列数据可视化和数据处理软件包组成,能够极大地提高数据分析的效率和准确性。

在使用 Tidyverse 的过程中,我们会经常用到以下几个工具:

  • ggplot2:用于数据可视化,可以绘制各种类型的图表,如散点图、柱状图、折线图等。
  • dplyr:数据整理和转换工具,使用 pipe(%>%)操作符来实现数据的转换和筛选。
  • tidyr:用于数据整理,可以将数据从宽型转换成长型,或将多个变量合并为一个变量。
  • readr:用于读取常见的数据格式,如 CSV、TXT 等。
  • stringr:用于字符串处理,可以进行字符串匹配、提取、替换等操作。
  • tibble:用于创建数据框。

本文将介绍R语言tidyverse包(包括ggplot2dplyrtidyr等),详细讲解这些包的使用方法。我们还将介绍什么是数据可视化、数据整理以及数据转换,这些知识都是数据分析过程中非常重要的基础。在本文中,您将学习到使用R语言进行数据分析的关键技能,例如使用ggplot2绘制令人惊叹的图表,使用dplyrtidyr包进行数据整理和转换,以及实用技巧,例如如何优雅地操作数据。通过本文的指导,您可以更加高效地进行数据分析,并将这些分析结果以更清晰、优美的图表呈现出来。

二、数据整理与转换

2.1 数据集

  1. 加载数据集
data(mtcars)
head(mtcars)
  1. 数据集展示
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

2.2 dplyr 的功能及其用法

dplyr 是一个强大的 R 库,用于数据的整理和转换,它具有简单易用的语法和高效的设计,通常使用 %>% 运算符来组合多种操作。

dplyr 提供一些基本操作,包括:

  • 选择数据列(select)
  • 重命名数据列(rename)
  • 过滤观测值(filter)
  • 排序(arrange)
  • 添加新变量(mutate)
  • 分组汇总(summarize)
  • 连接数据集(join)等。

下面是这些操作的详细示例:

2.1.1 选择数据列(select

挑选出mtcars数据集中部分数据,比如mpg, cyl 和 disp

library(dplyr)

select_data <- mtcars %>% select(mpg, cyl, disp)
head(select_data)

结果展示:

                   mpg cyl disp
Mazda RX4         21.0   6  160
Mazda RX4 Wag     21.0   6  160
Datsun 710        22.8   4  108
Hornet 4 Drive    21.4   6  258
Hornet Sportabout 18.7   8  360
Valiant           18.1   6  225

2.1.2 重命名数据列(rename

这里将在select_data数据集中重命名mpg为miles_per_gallon

select_data_rename <- select_data %>% rename(miles_per_gallon = mpg)
head(select_data_rename)

结果展示:

                  miles_per_gallon cyl disp
Mazda RX4                     21.0   6  160
Mazda RX4 Wag                 21.0   6  160
Datsun 710                    22.8   4  108
Hornet 4 Drive                21.4   6  258
Hornet Sportabout             18.7   8  360
Valiant                       18.1   6  225

从结果可以看出mpg已被修改为miles_per_gallon

2.1.3 过滤观测值(filter

这里我们将过滤出miles_per_gallon大于20的

select_data_rename_flter <- select_data_rename %>% filter(miles_per_gallon >= 20)
head(select_data_rename_flter)

结果展示:

               miles_per_gallon cyl  disp
Mazda RX4                  21.0   6 160.0
Mazda RX4 Wag              21.0   6 160.0
Datsun 710                 22.8   4 108.0
Hornet 4 Drive             21.4   6 258.0
Merc 240D                  24.4   4 146.7
Merc 230                   22.8   4 140.8

2.1.4 排序(arrange

这里我们将对miles_per_gallon进行降序排列

select_data_rename_flter_order <- select_data_rename_flter %>% arrange(desc(miles_per_gallon))
head(select_data_rename_flter_order)

结果展示:

               miles_per_gallon cyl  disp
Toyota Corolla             33.9   4  71.1
Fiat 128                   32.4   4  78.7
Honda Civic                30.4   4  75.7
Lotus Europa               30.4   4  95.1
Fiat X1-9                  27.3   4  79.0
Porsche 914-2              26.0   4 120.3

从结果可以看出数据按照miles_per_gallon降序排列

2.1.5 添加新变量(mutate

select_data_add <- select_data %>% mutate(l_per_100km = 235.21/mpg*100)
head(select_data_add)

结果展示:

                   mpg cyl disp l_per_100km
Mazda RX4         21.0   6  160    1120.048
Mazda RX4 Wag     21.0   6  160    1120.048
Datsun 710        22.8   4  108    1031.623
Hornet 4 Drive    21.4   6  258    1099.112
Hornet Sportabout 18.7   8  360    1257.807
Valiant           18.1   6  225    1299.503

2.1.6 分组汇总(summarize)

按照cyl分组,然后平均值

select_data_add_group <- select_data_add %>% group_by(cyl) %>% summarize(mean_mpg = mean(mpg))
head(select_data_add_group)

结果展示:

# A tibble: 3 × 2
    cyl mean_mpg
  <dbl>    <dbl>
1     4     26.7
2     6     19.7
3     8     15.1

2.1.7 连接数据集(join

新建两个数据集,通过连接键id进行关联,然后将两个数据集整合在一起

df1 <- data.frame(id = c(1,2,3), var1 = c("a","b","c"))
df2 <- data.frame(id = c(1,2,4), var2 = c("A","B","D"))
inner_join(df1, df2, by="id")

结果展示:

  id var1 var2
1  1    a    A
2  2    b    B

从结果可以看出数据已经拼接在一起了。

2.3 tidyr 的功能及其用法

tidyr 是一个 R 库,用于数据整理和转换,它强调数据的长型与宽型转换,经常与 dplyr 结合使用,提供了许多有用的函数,如 gatherspreadseparateunite 等。

  • gather:将数据从宽型转换成长型。
  • spread:将数据从长型转换成宽型。
  • separate:将一个变量拆分成多个变量。
  • unite:将多个变量合并为一个变量。

下面是这些转换方法的详细示例:

2.3.1 创建演示数据集

df <- data.frame(country = c("USA""Canada""Mexico"), 
                 `2000` = c(5, 2, 10), 
                 `2001` = c(7, 3, 9))

结果展示:

  country X2000 X2001
1     USA     5     7
2  Canada     2     3
3  Mexico    10     9

2.3.2 宽类型转长类型(gather

该函数将数据从宽格式转换为长格式。宽格式一般是指包含多列数据的格式,而长格式则是指只包含两列数据(变量列和值列)的格式。

使用方法:

gather(df, key = "variable", value = "value", cols = c("col1""col2"...))

示例:

library(tidyr)
library(dplyr)

# 将宽格式数据变为长格式数据
df_long <- df %>% 
  gather(key = "year", value = "value",-c("country"))
df_long

结果展示:

  country  year value
1     USA X2000     5
2  Canada X2000     2
3  Mexico X2000    10
4     USA X2001     7
5  Canada X2001     3
6  Mexico X2001     9

2.3.2 长类型转宽类型(spread

该函数将数据从长格式转换为宽格式。它通常用于将多个值列转换为单个宽型数据框中的列。

使用方法:

spread(df, key = "variable_name", value = "value")

示例:

df_wide <- df_long %>%
  spread(key = "year", value = "value")
df_wide

结果展示:

  country X2000 X2001
1  Canada     2     3
2  Mexico    10     9
3     USA     5     7

2.3.3 拆分变量(separate

该函数将一个变量拆分成多个变量。

使用方法:

separate(data, col, into, sep, remove = TRUE, convert = FALSE)

示例:

df <- data.frame(full_name = c("Steve Smith""Bob Johnson""Alice Chen"), 
                 age = c(25, 30, 27), 
                 salary = c("$100,000""$80,000""$120,000"))
df

df_separate <- df %>% 
  separate(full_name, c("first_name""last_name"), sep = " ")

df_separate

结果展示:

# df
    full_name age   salary
1 Steve Smith  25 $100,000
2 Bob Johnson  30  $80,000
3  Alice Chen  27 $120,000


# df_separate
  first_name last_name age   salary
1      Steve     Smith  25 $100,000
2        Bob   Johnson  30  $80,000
3      Alice      Chen  27 $120,000

在上面的示例中,我们使用 separate() 函数将 full_name 列拆分成 first_name 和 last_name 两列,并使用空格作为分隔符。

2.3.4 合并变量(unite

该函数将多个变量合并为一个变量。

使用方法:

unite(data, col, ..., sep = "_", remove = TRUE)

示例:

df_unit <- df_separate %>% 
  unite(full_name, c("first_name""last_name"), sep = " ")
df_unit

结果展示:

    full_name age   salary
1 Steve Smith  25 $100,000
2 Bob Johnson  30  $80,000
3  Alice Chen  27 $120,000

三、数据分析实战

在这部分中,我们将演示如何使用R语言中的ggplot2dplyrtidyr库进行数据分析。我们将使用一个真实的数据集,并进行数据导入、清洗、转换、分析和可视化等多个任务。通过本部分的演示,读者可以更好地理解ggplot2dplyrtidyr的相关知识,并在相似的数据分析任务中应用它们。

我们的任务是分析一份R语言自带的花的数据集。数据集包含了:

  • Sepal.Length:萼片长度,以厘米为单位
  • Sepal.Width:萼片宽度,以厘米为单位
  • Petal.Length:花瓣长度,以厘米为单位
  • Petal.Width:花瓣宽度,以厘米为单位
  • Species:鸢尾花的品种,包括三个类别:setosa、versicolor和virginica

我们将尝试回答以下问题:

  1. 不同品种鸢尾花的花瓣长度和宽度是否存在差异?
  2. 鸢尾花的大小是否与种类有关?

3.1 加载数据集

#加载iris数据集
data(iris)

#查看前几行数据
head(iris)

结果展示:

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

3.2 花瓣长度和宽度是否存在差异?

  1. 首先,我们用gather()函数将数据从宽格式变为长格式,以便更好地进行可视化
#使用gather函数将数据从宽格式变为长格式
iris_long <- iris %>%
  gather(key = "measurement", value = "value", Sepal.Length:Petal.Width)
iris_long

结果展示:

 Species  measurement value
1  setosa Sepal.Length   5.1
2  setosa Sepal.Length   4.9
3  setosa Sepal.Length   4.7
4  setosa Sepal.Length   4.6
5  setosa Sepal.Length   5.0
6  setosa Sepal.Length   5.4
  1. 然后,我们使用facet_grid()函数将不同种类的鸢尾花绘制在不同的子图中,更好地比较不同种类之间的差异。
#使用facet_grid()函数将不同品种鸢尾花绘制在不同的子图中
ggplot(iris_long, aes(x = measurement, y = value, fill = Species)) +
  geom_boxplot() +
  facet_grid(. ~ Species) +
  theme_bw() +
  labs(title = "不同品种鸢尾花的花瓣长度和宽度") +
  xlab("Measurement") +
  ylab("Value")

我们可以看到,不同品种鸢尾花的花瓣长度和宽度确实存在差异。鸢尾花“setosa”的花瓣相对较短而宽,而鸢尾花“versicolor”和“virginica”的花瓣相对较长但宽度较窄。

3.3 花的大小是否与种类有关?

接下来,我们可以使用dplyr库计算每朵鸢尾花的大小,并使用ggplot2可视化不同品种鸢尾花的大小分布情况。

#计算每朵鸢尾花的大小
iris <- iris %>%
  mutate(size = Petal.Length * Petal.Width)

结果展示:

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species size
1          5.1         3.5          1.4         0.2  setosa 0.28
2          4.9         3.0          1.4         0.2  setosa 0.28
3          4.7         3.2          1.3         0.2  setosa 0.26
4          4.6         3.1          1.5         0.2  setosa 0.30
5          5.0         3.6          1.4         0.2  setosa 0.28
6          5.4         3.9          1.7         0.4  setosa 0.68

绘图:

#绘制不同品种鸢尾花的大小分布情况
ggplot(iris, aes(x = Species, y = size, fill = Species)) +
  geom_boxplot() +
  theme_bw() +
  labs(title = "不同品种鸢尾花的大小") +
  xlab("Species") +
  ylab("Size")

我们可以看到,不同品种鸢尾花的大小分布情况也存在差异。鸢尾花“virginica”的大小分布最大,而鸢尾花“setosa”的大小分布最小。

四、实用技巧

4.1 读写数据文件

在R中读取和写入数据文件是数据分析任务中非常常见的操作。可以使用base R中的read.table()write.table()函数,也可以使用readr包中的read_csv()write_csv()等函数。

4.2 函数编写

在数据分析任务中,通常需要多次进行相同的数据转换操作。为了简化代码和提高效率,可以编写自己的函数来执行这些重复的任务。在R中,函数的编写非常简单,可以使用function()和return()语句创建自己的函数并执行特定操作。

4.3 R语言便捷快捷的代码技巧

  • 使用管道符( %>%):该符号可以大大减少代码长度和提高代码可读性。它允许你将一系列函数链接在一起,并将中间结果传递给下一个函数。
  • 使用匿名函数:在某些情况下,使用匿名函数可以减少代码量。通过使用(function(x) x^2)(5)这样的语法,可以直接对5进行平方运算,而不必定义一个具名函数。
  • 使用向量化操作:R中很多函数都是向量化的,这意味着它们可以同时处理整个向量。在处理数据分析任务中的大数据时,这是非常有用的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/675425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python浮点数:介绍、精度和应用

Python浮点数&#xff1a;介绍、精度和应用 Python是一种高级编程语言&#xff0c;许多程序员使用Python编写计算机程序。与其他编程语言不同&#xff0c;Python是一种动态类型的语言&#xff0c;并且它处理浮点数时更加灵活。在本文中&#xff0c;我们将介绍Python浮点数的概…

python自动化办公——读取PPT写入word表格

Python自动化办公——读取PPT内容写入word表格 文章目录 Python自动化办公——读取PPT内容写入word表格一、需求分析二、导入依赖三、代码四、结果及总结 一、需求分析 &#x1f4d6;由于我们知识图谱课程需要将课堂小组汇报的PPT总结成word文档&#xff0c;而我觉得一页一页复…

win10安装nginx的配置和使用方法(图文)

window10系统安装nginx服务&#xff0c;提供网页方面的服务。下面为详细图文安装配置教程。 1&#xff09;下载nginx软件 官方下载地址&#xff1a;http://nginx.org/en/download.html 2&#xff09;解压缩软件 unzip nginx-1.20.1.zip 或者 使用解压缩软件&#xff0c;下…

视频与AI,与进程交互(二) pytorch 极简训练自己的数据集并识别

目标学习任务 检测出已经分割出的图像的分类 2 使用pytorch pytorch 非常简单就可以做到训练和加载 2.1 准备数据 如上图所示&#xff0c;用来训练的文件放在了train中&#xff0c;验证的文件放在val中&#xff0c;train.txt 和 val.txt 分别放文件名称和分类类别&#xff…

Android之 弹框总结

一 简介 1.1 弹框即浮与页面之上的窗口&#xff0c;如键盘弹框&#xff0c;吐司弹框&#xff0c;确认弹框&#xff0c;下拉选择框&#xff0c;应用悬浮框等 1.2 弹框控件也很多&#xff0c;比如常用的Spinner&#xff0c;Dialog&#xff0c;Toast&#xff0c;PopWindow等&…

小主机折腾记14

1.m72e主机&#xff0c;3240t-2390t-3470t测试&#xff1b; 2390t官方参数 在m72e上 全核3.08Ghz 单核3.28-3.31Ghz 核显2帧 评分 3470t官方参数 在m72e上 全核睿频3.28 单核最高3.44 核显1.2帧&#xff1f;&#xff1f;&#xff1f;还不如那啥HD2000 最后评分 进入…

chatgpt赋能python:Python求累加的方法及其应用

Python求累加的方法及其应用 在Python编程中&#xff0c;经常需要对一系列数字进行求和或累加的操作。那么在Python中&#xff0c;我们可以通过哪些方法来实现这个功能呢&#xff1f;本文将为大家介绍Python求累加的方法及其应用。 1. Python中的for循环 首先&#xff0c;我…

05-事件循环

事件循环 以下知识点都涉及到事件循环 计时器&#xff0c;promise&#xff0c;ajax&#xff0c;node 明白此知识点&#xff0c;是前端的分水岭&#xff0c;可以提高效率&#xff0c;js中奇怪的东西都可以得到解决&#xff0c;整个过程是根据W3C和谷歌源码进行 浏览器的进程…

一文理解cast转换

目录 写在前边 1. what&#xff1f;又报错&#xff1a; 2. 靠&#xff0c;难道是这样&#xff1f; 3. 小试牛刀 4. 实际中的“坑” 写在后边 写在前边 关于$cast转换的结论无外乎以下四条&#xff1a; 如果将子类句柄复制给父类句柄&#xff0c;可以实现父类句柄的向下转换…

翻筋斗觅食策略改进灰狼算法

目录 一、动态扰动因子策略 二、翻筋斗觅食策略 三、改进灰狼算法收敛曲线图 灰狼优化算法(grey wolf optimization,GWO)存在收敛的不合理性等缺陷&#xff0c;目前对GWO算法的收敛性改进方式较少&#xff0c;除此之外&#xff0c;当GWO迭代至后期&#xff0c;所有灰狼个体…

企业版:Select.PDF Library for .NET

HTML 到 PDF API SelectPdf提供了一个REST API&#xff0c;可用于通过我们的专用云服务将html转换为任何语言的pdf。 另存为 PDF 链接 以非常简单的方式将“转换为PDF”功能添加到您的网站或博客。只需添加一个指向您的网页的链接&#xff0c;您就完成了。 适用于 .NET 的 PD…

Redis 通用命令

通用命令介绍 Redis 通用命令是一些 Redis 下可以作用在常用数据结构上的常用命令和一些基础的命令&#xff0c;比如删除键、对键进行改名、判断键是否存在等。简单说&#xff0c;就是 keys 分类的命令&#xff0c;如下图。 上图中圈中的部分&#xff0c;就是所谓的通用的命令…

chatgpt赋能python:Python对于SEO的重要性:浏览网页的技术分析

Python对于SEO的重要性&#xff1a;浏览网页的技术分析 越来越多的网站需要搜索引擎优化&#xff08;SEO&#xff09;&#xff0c;以便他们的网站上的内容能够被更多人浏览与访问。这就要求我们使用一些工具和技术&#xff0c;例如Python&#xff0c;来帮助我们分析网页的技术…

通过调整图像hue值并结合ImageEnhance库以实现色调增强

前言 PIL库中的ImageEnhance类可用于图像增强&#xff0c;可以调节图像的亮度、对比度、色度和锐度。 通过RGB到HSV的变换加调整可以对图像的色调进行调整。 两种方法结合可以达到更大程度的图像色调增强。 调整hue值 __author__ TracelessLe __website__ https://blog…

linux 下查看 USB 设备

文章目录 前言目录内容详解usb11-0:1.01-1.1:1.0 结构图设备信息bDeviceClassversionbusnum & devnumdevbMaxPoweridVendor & idProductproductmanufacturerbcdDevicespeedueventbmAttributesdrivers_autoprobe 前言 在 sysfs 文件系统下&#xff0c;查看 USB 设备&am…

PaddleOCR #使用PaddleOCR进行光学字符识别(PP-OCR文本检测识别)

引言&#xff1a; PaddleOCR 是一个 OCR 框架或工具包&#xff0c;它提供多语言实用的 OCR 工具&#xff0c;帮助用户在几行代码中应用和训练不同的模型。PaddleOCR 提供了一系列高质量的预训练模型。这包含三种类型的模型&#xff0c;使 OCR 高度准确并接近商业产品。它提供文…

【Unity 2D AABB碰撞检测】铸梦之路

作者介绍&#xff1a;铸梦xy。IT公司技术合伙人&#xff0c;IT高级讲师&#xff0c;资深Unity架构师&#xff0c;铸梦之路系列课程创始人。 目录1.AABB 碰撞介绍2.常用2D碰撞盒3.为什么要学习如何编写碰撞检测4.2D BOX & BOX 碰撞检测原理和代码5.2D BOX &Shpere 碰撞检…

Linux信号编程、signal函数范例详解( 4 ) -【Linux通信架构系列 】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the…

chatgpt赋能python:Python求1是什么?Python求1在SEO中的应用

Python求1是什么&#xff1f;Python求1在SEO中的应用 介绍Python求1 Python求1&#xff0c;也叫做1-bit计数器&#xff0c;是一种用来统计网页浏览量的技术。在Web开发中&#xff0c;我们需要记录网页的浏览次数&#xff0c;以便了解网站的流量和用户的使用情况。传统的做法是…

chatgpt赋能python:Python求绝对值:从初学者到高级工程师的必备知识

Python求绝对值&#xff1a;从初学者到高级工程师的必备知识 Python是一种有趣且功能强大的编程语言。它非常易于学习&#xff0c;同时又具有广泛的应用领域&#xff0c;比如Web开发、数据分析、机器学习和人工智能等。在Python的数学运算中&#xff0c;求绝对值是一个常见的需…