推广

R 数据处理(十三)—— tidyr

iseeyu2年前 (2024-02-21)推广148

image.png

这三条规则是相互关联的,不可能只满足这三条规则中的两条。这种相互关系产生了一套更简单实用的说明

  1. 将每个数据集存为 tibble
  2. 每个变量代表一列

在上面的示例中,只有 table1 是整齐的,每个变量表示为一列的形式

为什么要确保数据整洁呢?主要有以下两个优点

  1. 以一种一致的方式存储数据是有优势的,如果你的数据结构保持一致,则更容易学习和使用这些工具函数

  2. 在每个变量作为一列有一个优点,它能充分发挥 R 的向量化特性。 R 大多数的内置函数都可以与值向量一起使用,这使得对数据的转换显得特别自然

dplyrggplot2tidyverse 中所有的其他包都被设计用于处理整洁的数据。下面是几个小示例,展示如何使用 table1

> table1 %>% 
+     mutate(rate = cases / population * 10000)
# A tibble: 6 x 5
  country      year  cases population  rate
  <chr>       <dbl>  <dbl>      <dbl> <dbl>
1 Afghanistan  1999    745   19987071 0.373
2 Afghanistan  2000   2666   20595360 1.29 
3 Brazil       1999  37737  172006362 2.19 
4 Brazil       2000  80488  174504898 4.61 
5 China        1999 212258 1272915272 1.67 
6 China        2000 213766 1280428583 1.67

> table1 %>% 
+     count(year, wt = cases)
# A tibble: 2 x 2
   year      n
  <dbl>  <dbl>
1  1999 250740
2  2000 296920

> ggplot(table1, aes(year, cases)) + 
+     geom_line(aes(group = country), colour = "grey50") + 
+     geom_point(aes(colour = country))

image

2.1 思考练习

  1. 计算 table2table4a + table4b 的比率 rate,你可能需要执行下面 4 个操作
  • 提取每个国家每年的结核病病例数
  • 提取每个国家/地区每年匹配人口数
  • 将病例数除以人口数,再乘以 10000
  • 然后将比率放在适合的位置上

哪种表示法最容易使用?最难的是哪一个?为什么?

  1. 使用 table2 代替 table1 重新创建病例随时间变化的图。您首先需要做什么?

3. 透视表

通常在真实的分析中,我们遇到的数据都需要进一步进行一些整理。

第一步需要弄清楚变量和观察值是什么,有时候这很容易,但是有时可能需要询数据提供者

第二步需要解决下面两个常见问题:

  1. 一个变量可能分布在多个列上
  2. 一种观察值可能分散在多行中

要解决这些问题,您可以使用 tidyr 提供的两个最重要的函数:pivot_longer()pivot_wider()

3.1 Longer

一个常见的问题是,数据集中的列名不是变量名而是变量的值

比如说表 table4a,它的列名 19992000 代表的是年份变量的值,而这两列的值表示的是对应年份的 cases 变量的数值,而且每行是两个变量的值,而不是一个。

> table4a
# A tibble: 3 x 3
  country     `1999` `2000`
  <chr>        <dbl>  <dbl>
1 Afghanistan    745   2666
2 Brazil       37737  80488
3 China       212258 213766

要整理这样的数据集,我们需要将有问题的列透视到一对新的变量中。

为了描述该操作,我们需要三个参数:

  • 列名是值而不是变量,在本例中,是 19992000
  • 要将列名移至的变量名,在这里是 year
  • 要将列的值移动到的变量名称。在这里是 cases

将这些参数传递到 pivot_longer() 函数中

> table4a %>% 
+     pivot_longer(c(`1999`, `2000`), names_to = "year", values_to = "cases")
# A tibble: 6 x 3
  country     year   cases
  <chr>       <chr>  <dbl>
1 Afghanistan 1999     745
2 Afghanistan 2000    2666
3 Brazil      1999   37737
4 Brazil      2000   80488
5 China       1999  212258
6 China       2000  213766

列名可以使用 dplyr::select() 样式表示法指定。但是这里只有两列,因此将它们单独列出

注意19992000 是非语法名称(因为它们不是以字母开头),所以我们必须用反勾号将它们括起来

因为 table4a 中不存在 yearcases 列名,因此我们将其名称用引号引起来。

image.png

在最后的结果中,我们得到了两个新的列并删除了原来需要透视的两列。

pivot_longer() 通过增加行数和减少列数使数据集变长,当然这里说的长主要是相对原来的数据而言的。

我们可以使用 pivot_longer() 以类似的方式整理 table4b,唯一的区别是存储在单元格中的变量值

> table4b %>% 
+     pivot_longer(c(`1999`, `2000`), names_to = "year", values_to = "population")
# A tibble: 6 x 3
  country     year  population
  <chr>       <chr>      <int>
1 Afghanistan 1999    19987071
2 Afghanistan 2000    20595360
3 Brazil      1999   172006362
4 Brazil      2000   174504898
5 China       1999  1272915272
6 China       2000  1280428583

要将整理后的 table4atable4b 合并到一个 tible 中,我们可以使用 dplyr::left_join() 进行连接

> tidy4a <- table4a %>% 
+     pivot_longer(c(`1999`, `2000`), names_to = "year", values_to = "cases")
> tidy4b <- table4b %>% 
+     pivot_longer(c(`1999`, `2000`), names_to = "year", values_to = "population")
> left_join(tidy4a, tidy4b)
Joining, by = c("country", "year")
# A tibble: 6 x 4
  country     year   cases population
  <chr>       <chr>  <dbl>      <int>
1 Afghanistan 1999     745   19987071
2 Afghanistan 2000    2666   20595360
3 Brazil      1999   37737  172006362
4 Brazil      2000   80488  174504898
5 China       1999  212258 1272915272
6 China       2000  213766 1280428583

3.2 Wider

pivot_wilder()pivot_longer() 相反,当观察值分散在多行中时,可以使用它。

例如,在 table2type 观察值观察值分布在国家和年份的两行中

> table2
# A tibble: 12 x 4
   country      year type            count
   <chr>       <int> <chr>           <int>
 1 Afghanistan  1999 cases             745
 2 Afghanistan  1999 population   19987071
 3 Afghanistan  2000 cases            2666
 4 Afghanistan  2000 population   20595360
 5 Brazil       1999 cases           37737
 6 Brazil       1999 population  172006362
 7 Brazil       2000 cases           80488
 8 Brazil       2000 population  174504898
 9 China        1999 cases          212258
10 China        1999 population 1272915272
11 China        2000 cases          213766
12 China        2000 population 1280428583

我们首先以类似于 pivot_longer() 的方式分析。不过,这次我们只需要两个参数

  • 要从中获取变量名的列,在这里是 type
  • 要从中获取值的列,在这里是 count

一旦我们弄明白了这一点,我们就可以使用 pivot_wilder()

> table2 %>%
+     pivot_wider(names_from = type, values_from = count)
# A tibble: 6 x 4
  country      year  cases population
  <chr>       <int>  <int>      <int>
1 Afghanistan  1999    745   19987071
2 Afghanistan  2000   2666   20595360
3 Brazil       1999  37737  172006362
4 Brazil       2000  80488  174504898
5 China        1999 212258 1272915272
6 China        2000 213766 1280428583

image.png

可能你已经从它们的名字中猜到了,pivot_wilder()pivot_longer() 是互补的。

pivot_longer() 使宽表变窄和变长; pivot_wider() 使长表变短和变宽

3.3 思考练习

  1. 为什么 pivot_wilder()pivot_longer() 不完全对称?仔细思考下面的例子。
stocks <- tibble(
  year   = c(2015, 2015, 2016, 2016),
  half  = c(   1,    2,     1,    2),
  return = c(1.88, 0.59, 0.92, 0.17)
)
stocks %>% 
  pivot_wider(names_from = year, values_from = return) %>% 
  pivot_longer(`2015`:`2016`, names_to = "year", values_to = "return")

提示:注意变量类型并考虑列名

pivot_longer() 有一个 names_ptypes 参数,例如 names_ptypes=list(year=double)。它的作用是什么?

  1. 为什么下面的代码是错的?
> table4a %>% 
+     pivot_longer(c(1999, 2000), names_to = "year", values_to = "cases")
错误: Can't subset columns that don't exist.
x Locations 1999 and 2000 don't exist.
ℹ There are only 3 columns.
Run `rlang::last_error()` to see where the error occurred.
  1. 如果你要加宽表会发生什么?为什么?您如何添加新列来唯一标识每个值?
people <- tribble(
  ~name,             ~names,  ~values,
  #-----------------|--------|------
  "Phillip Woods",   "age",       45,
  "Phillip Woods",   "height",   186,
  "Phillip Woods",   "age",       50,
  "Jessica Cordero", "age",       37,
  "Jessica Cordero", "height",   156
)
  1. 整理下面的简单表。你需要将表变宽还是变长?变量要设置成什么?
preg <- tribble(
  ~pregnant, ~male, ~female,
  "yes",     NA,    10,
  "no",      20,    12
)

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/57546.html

相关文章

什么是营销策略(销售策略包括哪些方面)

什么是营销策略(销售策略包括哪些方面)

2.8. 营销策略 2.8.1. 营销策略的定义 营销策略是产品、价格、渠道、促销和公关策略的总和。是公司根据以往的营销活动或市场数据,预测消费者需求量以及购买力和市场的期望值,意在以提高营业额及企业声誉为目的的营销活动。 2.8.2. 营销的基本原则 即4P原则:产品策略、价格策略、渠...

预算有限?渠道推广时选择和优化渠道的6点经验

预算有限?渠道推广时选择和优化渠道的6点经验

APP推广的核心还是在于计算投产比,在预算有限的情况下要把账算明白,然后尽量去优化投产比即可。下面我来聊聊做渠道推广时如何选择渠道和如何优化渠道。 一、衡量渠道的价值,需要明白自己的核心指标是什么 为什么要推广?其实很多人在这里就没把问题给想明白,推广的目的不是为了获得用户这么简单。如...

提高网站收录率的方法分享。

提高网站收录率的方法分享。

搜索引擎收录的网站内容数量与网站点击量直接相关,从而影响网站排名。为此,站长们付出了很大的努力,使本站的内容精巧独到,以便被收录。站长们有自己独到的技能来改进自己站点中包含的内容。然而,他们掌握的方法越多,对自己就越有利。现在重蔚自留地小编将总结的各种提高网站收录率的方法分享给_。 1、优化网站结...

那些经久不衰的营销技巧之——限量版

那些经久不衰的营销技巧之——限量版

  “限量”本来是中比较常见的一种方式,但是在近年来,这种模式被冠以了新的名称——“饥饿营销”,实际上“饥饿营销”不过是扩大了数量规模的限量版营销手段。深入地思考一下,实际上每一种营销技巧所涉及的领域都要包含心理学的,而这也正是营销和销售最大的不同点,销售是直接,营销是通过...

小编教你对于企业而言网站推广有何重要意义。

小编教你对于企业而言网站推广有何重要意义。

从微博到微信朋友圈,再到快手、抖音等短视频平台,国内社交媒体每一个平台的流量都很大,只要不断输出优质内容,也很容易涨粉。如今成为焦点。接下来小编将为大家简单分析对于企业而言网站推广有哪些重要意义。 公司网站以公司的名义入驻这些新媒体平台,通过发布好的内容吸引用户,再把用户引向官网。它也是...

什么是90后出家的真相|独家原创

什么是90后出家的真相|独家原创

前两天,一篇《第一批90后已经出家》的文章在朋友圈刷屏,24小时微信指数突破1600万,之所以想写这篇文章,是因为生病了不能去种地,再就是觉得社会和年轻人不应该被片面娱乐化的舆论洗脑,还有些人乘机利用洞察到的人性,一味引导“丧文化”,这是不对的,看清《第一批90后已经出家》其社会现象背后的本质...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片