专栏首页庄闪闪的R语言手册R数据科学|3.4内容介绍及习题解答

R数据科学|3.4内容介绍及习题解答

3.4 使用select()选择列

通过基于变量名的操作,select()函数可以让你生成一个有用的变量子集。基本用法如下:

  • 按名称选择列
select(flights, year, month, day)
#> # A tibble: 336,776 × 3
#> year month day
#> <int> <int> <int>
#> 1 2013 1 1
#> 2 2013 1 1
#> 3 2013 1 1
#> 4 2013 1 1
#> 5 2013 1 1
#> 6 2013 1 1
#> # ... with 3.368e+05 more rows
  • 选择“year”和“day”之间的所有列(包括“year”和“day”)
select(flights, year:day)
#> # A tibble: 336,776 × 3
#> year month day
#> <int> <int> <int>
#> 1 2013 1 1
#> 2 2013 1 1
#> 3 2013 1 1
#> 4 2013 1 1
#> 5 2013 1 1
#> 6 2013 1 1
#> # ... with 3.368e+05 more rows
  • 选择不在“year”和“day”之间的所有列(不包括“year”和“day”)
select(flights, -(year:day))
#> # A tibble: 336,776 × 16
#> dep_time sched_dep_time dep_delay arr_time sched_arr_time
#> <int> <int> <dbl> <int> <int>
#> 1 517 515 2 830 819
#> 2 533 529 4 850 830
#> 3 542 540 2 923 850
#> 4 544 545 -1 1004 1022
#> 5 554 600 -6 812 837
#> 6 554 558 -4 740 728
#> # ... with 3.368e+05 more rows, and 12 more variables:
#> # arr_delay <dbl>, carrier <chr>, flight <int>,
#> # tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>,
#> # distance <dbl>, hour <dbl>, minute <dbl>,
#> # time_hour <dttm>

还可以在select()函数中使用一些辅助函数。

  • starts_with("abc"):匹配以“abc”开头的名称。
  • ends_with("xyz"):匹配以“xyz”结尾的名称。
  • contains("ijk"):匹配包含“ijk”的名称。
  • matches("(.)\1"):选择匹配正则表达式的那些变量。这个正则表达式会匹配名称中有重复字符的变量。
  • num_range("x", 1:3):匹配 x1、x2 和 x3。

3.4课后习题

答案仅供参考,如有误,望在评论区指正。

问题一

flights 数据集中选择dep_timedep_delayarr_timearr_delay通过头脑风暴找出尽可能多的方法。

解答

  • 方法一
select(flights, dep_time, dep_delay, arr_time, arr_delay)

  • 方法二
select(flights, "dep_time", "dep_delay", "arr_time", "arr_delay")

  • 方法三
select(flights, 4, 6, 7, 9)

  • 方法四
select(flights, all_of(c("dep_time", "dep_delay", "arr_time", "arr_delay")))

  • 方法五
select(flights, any_of(c("dep_time", "dep_delay", "arr_time", "arr_delay")))

  • 方法六
variables <- c("dep_time", "dep_delay", "arr_time", "arr_delay")
select(flights, all_of(variables))
  • 方法七
select(flights, starts_with("dep_"), starts_with("arr_"))

问题二

如果在select()函数中多次计入一个变量名,那么会发生什么情况?

解答

  • select()调用会忽略重复的内容。任何重复的变量只包含一次,即在它们出现的第一个位置。如果存在重复变量select()函数不会引发错误或警告,也不会输出任何消息。
select(flights, year, month, day, year, year)

  • 这种机制非常有用,因为它意味着我们可以使用select()everything()来轻松地更改列的顺序,而不必指定所有列的名称。
select(flights, arr_delay, everything())

问题三

one_of()函数的作用是什么?为什么它结合以下向量使用时非常有用?

vars <- c(
"year", "month", "day", "dep_delay", "arr_delay"
)

解答

  • one_of()函数的作用是:选择带有字符向量的变量,而不是不带引号的变量名参数。这个函数很有用,因为通过编程生成带有变量名的字符向量比生成不带引号的变量名更容易,后者更容易键入。
vars <- c("year", "month", "day", "dep_delay", "arr_delay")
select(flights, one_of(vars))
  • dplyr的最新版本中,one_of()已被弃用,而支持两个函数:all_of()any_of()。如果所有的变量都出现在数据框中,这些函数的作用是相似的。
select(flights, any_of(vars))
select(flights, all_of(vars))
  • 这些函数在严格程度上有所不同。如果其中一个变量名不存在all_of()函数将报错,而any_of()将忽略它。如果遇到未知列,one_of()将发出警告。

问题四

以下代码的运行结果是否出乎意料?选择辅助函数处理大小写的默认方式是什么?如何改变默认方式?

select(flights, contains("TIME"))

解答

  • contains()的默认行为是忽略大小写。
select(flights, contains("TIME"))
#> # A tibble: 336,776 x 6
#>   dep_time sched_dep_time arr_time sched_arr_time air_time time_hour          
#>      <int>          <int>    <int>          <int>    <dbl> <dttm>             
#> 1      517            515      830            819      227 2013-01-01 05:00:00
#> 2      533            529      850            830      227 2013-01-01 05:00:00
#> 3      542            540      923            850      160 2013-01-01 05:00:00
#> 4      544            545     1004           1022      183 2013-01-01 05:00:00
#> 5      554            600      812            837      116 2013-01-01 06:00:00
#> 6      554            558      740            728      150 2013-01-01 05:00:00
#> # … with 336,770 more rows
  • 要更改默认方式,添加参数ignore.case= FALSE
select(flights, contains("TIME", ignore.case = FALSE))
#> # A tibble: 336,776 x 0

本文分享自微信公众号 - 庄闪闪的R语言手册(Zss_R4ds),作者:我才是赵西西

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-12-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • R数据科学|3.7内容介绍及习题解答

    虽然与summarize()函数结合起来使用是最有效的,但分组也可以与mutate()和filter()函数结合,以完成非常便捷的操作。示例如下:

    庄闪闪
  • R数据科学|3.5内容介绍及习题解答

    上节我们对选择现有的列进行了介绍与习题解答,现在对数据框添加新列进行介绍,这里使用mutate()函数,注意:mutate()总是将新列添加在数据集的最后。

    庄闪闪
  • R数据科学|5.4内容介绍及习题解答

    我们不建议使用这种方式,因为一个无效测量不代表所有测量都是无效的。此外,如果数据质量不高,若对每个变量都采取这种做法,那么你最后可能会发现数据已经所剩无几!

    庄闪闪
  • R数据科学|5.5.2内容介绍及课后习题解答

    要想对两个分类变量间的相关变动进行可视化表示,需要计算出每个变量组合中的观测数量。常用的两种方法有:

    庄闪闪
  • R数据科学|5.5.3内容介绍

    最简单的一种方法是:使用geom_point()画出散点图。你可以将相关变动看作点的模式。例如,你可以看到钻石的克拉数和价值之间存在一种指数关系:

    庄闪闪
  • R数据科学|3.6内容介绍

    上节我们对选择现有的列和使用mutate添加新列做了介绍。现在对数据框使用summarize()进行分组摘要进行介绍。函数功能:summarize()可以将数据...

    庄闪闪
  • R数据科学|5.5.1 内容介绍

    如果变动描述的是一个变量内部的行为,那么相关变动描述的就是多个变量之间的行为。相关变动是两个或多个变量以相关的方式共同变化所表现出的趋势。查看相关变动的最好 方...

    庄闪闪
  • R数据科学|5.3内容介绍

    上一期我们对《R数据科学》第3.7节进行了内容介绍和习题解答,细心的读者可以发现,这里直接跳转到了5.3节了。原因在于中间各节内容干货较少,也没有习题,所以就跳...

    庄闪闪
  • R数据科学|第九章内容介绍

    在实际应用中,我们常会涉及到多个数据表,必须综合使用它们才能找到关键信息。存在于多个表中的这种数据统称为关系数据。本章中的很多概念都和SQL中的相似,只是在dp...

    庄闪闪
  • R数据科学|第七章内容介绍

    tibble是一种简单数据框,它对data.frame的功能进行了一些修改,更易于使用。本文将介绍tidyverse的核心R包之一——tibble包

    庄闪闪
  • R数据科学|第十章内容介绍

    可以使用str_sub()函数来提取字符串的一部分。除了字符串参数外,str_sub() 函数中还 有 start 和 end 参数,它们给出了子串的位置(包括...

    庄闪闪
  • R数据科学|第八章内容介绍

    本文将介绍如何使用readr包将平面文件加载到 R 中,readr 也是 tidyverse 的核心 R包之一。

    庄闪闪
  • R数据科学|第十一章内容介绍

    因子在 R 中用于处理分类变量。从历史上看,因子远比字符串更容易处理。因此,R 基础包中的很多函数都自动将字符串转换为因子。

    庄闪闪
  • R数据科学|3.6习题解答

    这个问题是数据分析的一个基本问题:成本函数。作为分析人员,我们之所以对航班延误感兴趣,是因为对乘客来说代价高昂。在许多情况下,到达延迟更重要。在大多数情况下,迟...

    庄闪闪
  • R数据科学|5.5.1 习题解答

    前面对比了已取消航班和未取消航班的出发时间,使用学习到的知识对这个对比的可视化结果进行改善。

    庄闪闪
  • R数据科学|5.3课后习题解答

    研究 x、y 和 z 变量在 diamonds 数据集中的分布。你能发现什么?思考一下,对于一条钻石数据,如何确定表示长、宽和高的变量?

    庄闪闪
  • (数据科学学习手札41)folium基础内容介绍

      folium是js上著名的地理信息可视化库leaflet.js为Python提供的接口,通过它,我们可以通过在Python端编写代码操纵数据,来调用leaf...

    Feffery
  • (数据科学学习手札42)folium进阶内容介绍

      在上一篇(数据科学学习手札41)中我们了解了folium的基础内容,实际上folium在地理信息可视化上的真正过人之处在于其绘制图像的高度可定制化上,本文就...

    Feffery
  • (数据科学学习手札43)Plotly基础内容介绍

      Plotly是一个非常著名且强大的开源数据可视化框架,它通过构建基于浏览器显示的web形式的可交互图表来展示信息,可创建多达数十种精美的图表和地图,本文就将...

    Feffery

扫码关注云+社区

领取腾讯云代金券