R语言入门 | 使用 dplyr 进行数据转换

news2024/11/15 15:54:04

3.1简介

3.1.1准备工作 

3.1.2 dplyr 基础

按值筛选观测( filter() )。
对行进行重新排序( arrange() )。
按名称选取变量( select() )。
使用现有变量的函数创建新变量( mutate() )。
将多个值总结为一个摘要统计量( summarize()

 

3.2 使用 filter() 筛选行 

filter() 函数可以基于观测的值筛选出一个观测子集。

filter(数据集,条件)

filter(flights, month == 1, day == 1)

注意:用双等号

进行赋值,保存数据集

jan1 <- filter(flights, month == 1, day == 1)

3.2.1 比较运算符 

比较运算符:>>=<<=!=(不等于)和 ==(等于)

比较浮点数是否相等时,不能使用 ==,而应该使用 near()

3.2.2 逻辑运算符 

& 表示“与”、| 表示 “或”、! 表示“非”。

filter(flights, month >= 5 | month <= 12)

filter(flights, month == 11 & day == 12)

而不是用&&,||(不要和C语言混淆)

简写形式:x %in% y

简化前:filter(flights, month == 1|month==3|month == 12)

简化后:filter(flights, month%in%c(1,3,12))

3.2.3 缺失值 

 is.na() 函数:确定一个值是否为缺失值

filter() 只能筛选出条件为 TRUE 的行;它会排除那些条件为 FALSE NA 的行。如果想保
留缺失值,需要明确指出


3.2.4 练习

a. 到达时间延误 2 小时或更多的航班。
filter(flights,arr_delay>=120)
b. 飞往休斯顿(IAH 机场或 HOU 机场)的航班。
filter(flights,dest=="TAH"|dest=="HOU")
c. 由联合航空(United)、美利坚航空(American)或三角洲航空(Delta)运营的航班。
filter(flights,carrier%in%c("AA","UA","DL"))
d. 夏季(7 月、8 月和 9 月)出发的航班。
 filter(flights,month%in%c(7,8,9))
e. 到达时间延误超过 2 小时,但出发时间没有延误的航班。
filter(flights,arr_delay>120&dep_delay==0)
f. 延误至少 1 小时,但飞行过程弥补回 30 分钟的航班。
filter(flights,arr_delay>=60,(arr_delay-dep_delay)>=30)
g. 出发时间在午夜和早上 6 点之间(包括 0 点和 6 点)的航班。
filter(flights,dep_time<=600|dep_time==2400)

3.3 使用 arrange() 排列行

arrange() 函数:排序(默认升序)
参数:一个数据框和一组作为排序依据的列名
默认升序排列:
arrange(diamonds,price)
如果要降序排列:
arrange(diamonds,desc(price))
注意:如果列名不只一个,那么就使用后面的列在前面排序的基础上继续排
arrange(diamonds,cut,desc(price))

注意:NA数据总是排在最后(无论升序、降序)。

3.4 使用 select() 选择列 

3.4.1select()函数

看到想要看的数据子集。

逗号:不连续筛选
冒号:连续筛选
# 按名称选择列
select (flights, year, month, day)
# 选择“ year ”和“ day ”之间的所有列(包括“ year ”和“ day ”)
select (flights, year : day)
# 选择不在“ year ”和“ day ”之间的所有列(不包括“ year ”和“ day ”)
select (flights, -(year : day))

3.4.2一些辅助函数

starts_with("abc") :匹配以“ abc ”开头的名称。
ends_with("xyz") :匹配以“ xyz ”结尾的名称。
contains("ijk") :匹配包含“ ijk ”的名称。
matches("(.)\\1") :选择匹配正则表达式的那些变量。这个正则表达式会匹配名称中有
重复字符的变量。
num_range("x", 1:3) :匹配 x1 x2 x3
 
rename() 函数:重命名变量
rename(flights, deptime = dep_time)
 参数1:数据集 参数2:修改后 参数3:修改前   
     
        
select() 函数+everything() 辅助函数
可将几个指定变量移到数据框开头,其余变量依次排序:
select(flights, time_hour, air_time, everything())

3.5 使用 mutate() 添加新变量 

mutate()函数:添加新列

flights_sml <- select(flights,year:day,ends_with("delay"),distance,air_time)

mutate(flights_sml,gain = arr_delay - dep_delay,speed = distance / air_time * 60)

一旦创建,新列就可以立即使用:

mutate(flights_sml, gain = arr_delay - dep_delay, hours = air_time / 60, gain_per_hour = gain / hours )

transmute() 函数:只保留新变量,其余不要

3.5.1 常用创建函数 

算术运算符

+-*/^
%/%(整数除法)
 %%(求余)

对数函数

log()log2() log10()

偏移函数

lead() lag() 函数 可以返回一个序列的领先值和滞后值。

cumsum()累加和
cumprod()累加积
commin() 累加最小值
cummax()累加最大值
cummean() 累加均值

排秩

rank函数(排名)(默认升序)(从低到高)

desc函数(倒序)(从高到低)

区别sort(排序):

minrank()函数

出现相同元素时,用minrank()排名,rank()算积分

练习: 使用排秩函数找出 10 个延误时间最长的航班。如何处理名次相同的情况?仔细阅读
min_rank() 的帮助文件。

3.6 使用 summarize() 进行分组摘要

 summarize()可以将数据框折叠成一行

summarize(flights, delay = mean(dep_delay, na.rm = TRUE))

na.rm = TRUE:移除NA值

group_by()

可以将分析单位从整个数据集更改为单个分组

by_day <- group_by(flights, year, month, day)
summarize(by_day, delay = mean(dep_delay, na.rm = TRUE))

得到每一天的平均延误时间:

 练习:找平均延误时间最长的10个城市

by_city=group_by(flights,dest)%>%summarize(avg_delay=mean(arr_delay,na.rm=TRUE))%>%mutate(r=min_rank(desc(avg_delay)))%>%filter(r<=10)

不同加工钻石平均价格和数量
by_cut <- group_by(diamonds, cut)
 summarize(by_cut, mean_price = mean(price,count=n(), na.rm = TRUE))

3.6.1 使用管道组合多种操作

常规做法

 by_dest <- group_by(flights, dest)     //根据目的地分组

delay <- summarize(by_dest,
count = n(),
dist = mean(distance, na.rm = TRUE),
delay = mean(arr_delay, na.rm = TRUE)
)         //研究每个目的地的距离和平均延误时间之间的关系

delay <- filter(delay, count > 20, dest != "HNL")     //在delay中去除起飞量20以下的,去除目的地HNL的

ggplot(data = delay, mapping = aes(x = dist, y = delay)) +
 geom_point(aes(size = count), alpha = 1/3) +
 geom_smooth(se = FALSE)

管道做法

%>%就像一根管道一样,把前面的命令结果传给后面地命令作为参数。可以理解为“然后”。

delays <- flights %>%
group_by(dest) %>%
summarize(
count = n(),
dist = mean(distance, na.rm = TRUE),
delay = mean(arr_delay, na.rm = TRUE)
) %>%
filter(count > 20, dest != "HNL")

3.6.2 缺失值 

方法一:
flights %>% group_by(year, month, day) %>% summarize(mean = mean(dep_delay, na.rm = TRUE ))
na.rm 参数:可以在计算前除 去缺失值
方法二:提前处理na
not_cancelled <- flights %>% filter( !is.na(dep_delay), !is.na(arr_delay) )
not_cancelled %>% group_by(year, month, day) %>% summarize(mean = mean(dep_delay))

3.6.3 计数

1.n()  (需要na.rm=TRUE)  

delays <- not_cancelled %>%
group_by(tailnum) %>%
summarize(
delay = mean(arr_delay, na.rm = TRUE ),
count = n()
)

2.非缺失值的计数(sum(!is_na())

注:数据来源Lahman 包中Batting数据集

# 转换成tibble,以便输出更美观

batting <- as_tibble(Lahman::Batting)

batters <- batting %>%
group_by(playerID) %>%
summarize(
ba = sum(H, na.rm = TRUE) / sum(AB, na.rm = TRUE),
ab = sum(AB, na.rm = TRUE)      //能力(ba)和击球机会数量(ab)
)
batters %>%
filter(ab > 100) %>%    //筛选出击打球数量超过100的球员,避免偶然情况
ggplot(mapping = aes(x = ab, y = ba)) +
geom_point() +
geom_smooth(se = FALSE)

结论:说明球员出场次数越多,命中率越高,但当出场次数足够多时,能力也就趋于稳定了。

最后我们来找出最伟大的十个球员。

batters%>%filter(ab>1000)%>%arrange(desc(ba))

3.6.4 常用的摘要函数 

为了后面方便演示,我们先对没有取消的航班建立一个数据集
not_cancelled<-flights%>%filter(!is.na(dep_delay),!is.na(arr_delay))

位置度量

 mean(x):平均数

 median(x):中位数

not_cancelled %>%
group_by(year, month, day) %>%
summarize(
# 平均延误时间:
avg_delay1 = mean(arr_delay),
# 平均正延误时间:
avg_delay2 = mean(arr_delay[arr_delay > 0])
)

分散程度度量

 sd(x):均方误差/标准误差
 IQR(x): 四分 位距
 mad(x):差 mad(x)
Q:为什么到某些目的地的距离比到其他目的地更多变?
not_cancelled %>%
group_by(dest) %>%
summarize(distance_sd = sd(distance)) %>%
arrange(desc(distance_sd))

秩的度量

min(x)
quantile(x, 0.25):  分位数,这里会找出 x 中按从小到大顺序大于前 25% 而小于后 75% 的值
max(x)
Q: 每天最早和最晚的航班何时出发?
not_cancelled %>%
group_by(year, month, day) %>%
summarize(
first = min(dep_time),
last = max(dep_time)
)

Q:找出不同加工钻石中最贵和最便宜的

diamonds %>%
group_by(cut) %>%
summarize(
cheapest = min(price),
most_exp = max(price)
)

定位度量

first(x):与 x[1] 相同

nth(x, 2):与x[2] 相同

 last(x):与x[length(x)] 相同

记得先排序再使用。

diamonds %>%
group_by(cut) %>%arrange(desc(price))%>%
summarize(
cheapest = last(price),
most_exp = first(price)
)

range(r)

给出范围中的最小值和最大值

#每天起飞最晚和最早的航班
not_cancelled %>% + group_by(year, month, day) %>% + mutate(r = min_rank(desc(dep_time))) %>% + filter(r %in% range(r))

#找出不同加工钻石中最贵的那一颗和最便宜的那一颗
diamonds %>%
+     group_by(cut) %>%
+     mutate(r = min_rank(desc(price))) %>%
+     filter(r %in% range(r))

计数

n_ distinct(x) 唯一值,统计时去除重复的情况
通过下面这个简单的例子,我们来看看n()函数和n_distinct()函数的区别
y=c("aa","aa","ua","ua","dl")
> demo=data.frame(y)

# 哪个目的地具有最多的航空公司?
not_cancelled %>%
group_by(dest) %>%
summarize(carriers = n_distinct(carrier) ) %>%
arrange(desc(carriers))
飞往ATL,BOS,,CLT,ORD,TPA的航空公司最多。
count(x)
用于只需要计数的情况
#每个颜色的钻石有多少颗?
diamonds%>%count(color)
比这样写简单:diamonds%>%group_by(color)%>%summarise(n=n())
还可以选择提供一个加权变量。例如,你可以使用以下代码算出每架飞机飞行的总里程
数(实际上就是求和)
not_cancelled%>%count(tailnum,wt=distance)

逻辑值的计数和比例

sum(x > 10) mean(y == 0)
当与数值型函数一同使用时, TRUE 会转换为 1 FALSE 会转换为 0
这使得 sum() mean() 非常适用于逻辑值:sum(x) 可以找出 x TRUE 的数量, mean(x) 则可以找出TRUE比例。
sum(x<51)
此时,统计的是满足条件的个数
not_cancelled %>%
group_by(year, month, day) %>%
summarize(n_early = sum(dep_time < 500))
#每天的红眼航班(五点前出发)有几班?
mean(arr_delay > 60)
# 延误超过1小时的航班比例是多少?
not_cancelled %>%
group_by(year, month, day) %>%
summarize(hour_perc = mean(arr_delay > 60))

3.6.5 按多个变量分组 

循序渐进地进行摘要分析

daily <- group_by(flights, year, month, day)
(per_day <- summarize(daily, flights = n()))
(per_month <- summarize(per_day, flights = sum(flights)))

(per_year <- summarize(per_month, flights = sum(flights)))

3.6.6 取消分组 

ungroup()函数:取消分组

daily<-group_by(flights,year,month,day)
daily%>%ungroup()%>%summarize(n())

3.7 分组新变量(和筛选器)

diamonds%>%group_by(color)%>%filter(min_rank(desc(price))<=5)

不同颜色钻石中最贵的5颗钻石popular_dests % group_by(dest) %>% filter(n() > 365)

popular_dests %>% filter(arr_delay > 0) %>% mutate(prop_delay = arr_delay / sum(arr_delay)) %>% select(year:day, dest, arr_delay, prop_delay)

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

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

相关文章

企业如何打造通证经济生态闭环详解(中)

全球化企业通证积分管理系统中通证积分如何发行&#xff1f; 首先提倡的是健康、绿色的通证资产&#xff0c;所有的通证资产不能通过与现金的买卖获得&#xff0c;是通过在平台完成对应的任务获得&#xff0c;是通过奖励的形式释放给用户。主要有哪些形式的任务可以释放通证积…

失落的方舟 命运方舟台服怎么下载游戏客户端 游戏账号怎么注册

《失落的方舟》&#xff08;Lost Ark&#xff09;是韩国Smilegate公司精心打造的一款大型多人在线角色扮演游戏&#xff08;MMORPG&#xff09;&#xff0c;以其精美的画面、沉浸式的剧情、类似动作游戏的战斗体验和广阔的开放世界设定&#xff0c;自面世以来便深受全球玩家喜爱…

【深度好文】AI企业融合联盟营销,做的好就是最大赢家!

AI工具市场正在迅速发展&#xff0c;现仍有不少企业陆续涌出&#xff0c;那么如何让你的工具受到目标群体的关注呢&#xff1f;这相比是AI工具营销人员一直在思考的问题。 即使这个市场正蓬勃发展&#xff0c;也无法保证营销就能轻易成功。AI工具虽然被越来越多人认可和接受&a…

【C language】判断一个正整数是否是2^n

题解&#xff1a;判断一个正整数是否是2^n(位运算方法) 1.题目 判断一个正整数是否是2^n 2.位运算法 思路&#xff1a;干掉二进制最右边的1&#xff0c;看是否是0 int main() {int num 16;if ((num & (num - 1)) 0) printf("the num is a 2^n");else print…

Python 之微信指数小程序数据抓取

Fiddler安装和设置 安装 Fiddler 安装包可以从这里获取&#xff0c;如果失效了可以自己网上找一个安装。 链接&#xff1a;https://pan.baidu.com/s/1N30BoDWm2_dBL8i8GRzK5g?pwd1znv 提取码&#xff1a;1znv 然后就是点击安装就好了&#xff0c;没什么好多说的。 启用…

100道面试必会算法-26-删除排序链表中的重复元素

100道面试必会算法-26-删除排序链表中的重复元素|| 链表是一种常见的数据结构&#xff0c;它以节点的形式存储数据&#xff0c;每个节点包含数据以及指向下一个节点的引用。链表在插入和删除操作上有较高的效率&#xff0c;因此在许多应用中得到了广泛的使用。然而&#xff0c…

用香橙派AIpro部署大模型、安装宝塔搭建私有随身WEB开发环境

什么是香橙派 Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能 AI 开发板&#xff0c;其搭载了昇腾 AI 处理器&#xff0c;可提供 8TOPS INT8 的计算能力&#xff0c;内存提供了 8GB 和 16GB两种版本。可以实现图像、视频等多种数据分析与推理计算&#xff0c;可广泛…

IPFoxy Tips:海外代理IP适用的8个跨境出海业务

在当今数字化时代&#xff0c;互联网已经成为商业和个人生活不可或缺的一部分。IP代理作为出海业务的神器之一&#xff0c;备受跨境出海业务人员关注。IPFoxy动态、静态纯净代理IP也根据业务需求的不同&#xff0c;分为静态住宅、动态住宅、静态IPv4、静态IPv6四种类型代理。那…

电脑msvcp140_atomic_wait.dll丢失的高效率解决方法,快速的一键修复

我们常常遇到各种不可预见的电脑故障问题&#xff0c;msvcp140_atomic_wait.dll丢失是一个常见的系统错误&#xff0c;它通常发生在Windows操作系统中&#xff0c;特别是当用户尝试运行依赖于Microsoft Visual C Redistributable的应用程序时。该问题可能导致程序崩溃或无法启动…

App Inventor 2 低功耗蓝牙BLE 两种通信方式:扫描和广播

低功耗蓝牙&#xff0c;也称为蓝牙 LE 或简称 BLE&#xff0c;是一种类似于经典蓝牙的新通信协议&#xff0c;不同之处在于它旨在消耗更少的功耗&#xff0c;同时保持可比的功能。 因此&#xff0c;低功耗蓝牙是与耗电资源有限的物联网设备进行通信的首选。BluetoothLE 扩展需…

神经网络不确定性综述(Part I)——A survey of uncertainty in deep neural networks

相关链接&#xff1a; 神经网络不确定性综述(Part I)——A survey of uncertainty in deep neural networks-CSDN博客 神经网络不确定性综述(Part II)——Uncertainty estimation_Single deterministic methods-CSDN博客 神经网络不确定性综述(Part III)——Uncertainty est…

这个橙子真的香!老司机徒手把玩香橙派Kunpeng Pro事后回忆录

说&#xff01;你是哪个门派&#xff1f; 香橙&#xff0c;芸香科柑橘属小乔木。枝通常有粗长刺&#xff0c;新梢及嫩叶柄常被疏短毛。叶厚纸质&#xff0c;翼叶倒卵状椭圆形&#xff0c;顶部圆或钝。。。 咦&#xff1f;小李&#xff1f;我们不是搞IT的嘛&#xff0c;怎么会有…

Spring OAuth2:开发者的安全盾牌!(上)

何利用Spring OAuth2构建坚不可摧的安全体系&#xff1f;如何使用 OAuth2 从跨域挑战到性能优化&#xff0c;每一个环节都为你的应用保驾护航&#xff1f; 文章目录 Spring OAuth2 详解1. 引言简述OAuth2协议的重要性Spring Framework对OAuth2的支持概述 2. 背景介绍2.1 OAuth2…

2023年西安交通大学校赛(E-雪中楼)

E.雪中楼 如果算出按南北的序列&#xff0c;再转成从低到高的编号序列&#xff0c;岂不是太麻烦了&#xff0c;幸好&#xff0c;没有在这方面费长时间&#xff0c;而是意识到&#xff0c;本质就是要从低到高的编号序列&#xff0c;所以我就按样例模拟了一下&#xff0c;当a[i]0…

为什么AI企业需要联盟营销?

AI工具市场正在迅速发展&#xff0c;现仍有不少企业陆续涌出&#xff0c;那么如何让你的工具受到目标群体的关注呢&#xff1f;这相比是AI工具营销人员一直在思考的问题。 即使这个市场正蓬勃发展&#xff0c;也无法保证营销就能轻易成功。AI工具虽然被越来越多人认可和接受&a…

DETR整体模型结构解析

DETR流程 Backbone用卷积神经网络抽特征。最后通过一层1*1卷积转化到d_model维度fm&#xff08;B,d_model,HW&#xff09;。 position embedding建立跟fm维度相同的位置编码(B&#xff0c;d_model,HW&#xff09;。 Transformer Encoder,V为fm&#xff0c;K&#xff0c;Q为fm…

QT基础初学

目录 1.什么是QT 2.环境搭建 QT SDK的下载 QT的使用 QT构建项目 快捷指令 QT的简单编写 对象树 编码问题 组件 初识信号槽 窗口的释放 窗口坐标体系 1.什么是QT QT 是一个跨平台的 C 图形用户界面库&#xff0c;支持多个系统&#xff0c;用于开发具有图形界面的应…

File name ‘xxxx‘ differs from already included file name ‘xxxx‘ only in casing.

一、报错信息 VSCode报错如下&#xff1a; File name ‘d:/object/oral-data-management/src/components/VisitLogPopup/Info.vue’ differs from already included file name ‘d:/object/oral-data-management/src/components/VisitLogPopup/INfo.vue’ only in casing. The…

AI企业需要“联盟营销”?一文带你探索AI企业营销新玩法!

为什么联盟营销对AI业务有较大优势 联盟营销在电商领域、saas领域与其他产品领域同样有效。在AI业务中&#xff0c;它有效的原因与其他领域大不相同。 高好奇心和试用率 AI领域是创新的热点。它吸引了一群渴望探索和尝试每一项新技术的人群。这种蓬勃的好奇心为聪明的AI企业提…

大模型助力企业提效,九章云极DataCanvas公司联合腾讯搜狗输入法发布私有化解决方案

近日&#xff0c;九章云极DataCanvas公司与腾讯搜狗输入法的合作再次升级。在搜狗输入法开发者中心正式推出之际&#xff0c;九章云极DataCanvas公司作为搜狗输入法的首批开发合作伙伴&#xff0c;双方联合发布“企业知识管理助手”私有化解决方案。 “企业知识管理助手”整体私…