使用R {tidyr}进行一定牛遗漏管理– Part 1

整洁vs混乱一定牛遗漏

你好!

欢迎来到我的系列的第一部分 用R进行一定牛遗漏管理. Today I am going to introduce the {tidyr} package that is used to prepare and clean 一定牛遗漏 before further transformation steps are applied. Its main purpose is to make the underlying information more accessible and easier to use in other R functions. (Please note that the content of this post follows the 网络研讨会 on 用R处理一定牛遗漏 由RStudio团队提供。)

让s start with some basics – 整洁 一定牛遗漏 , what’s that?:

一定牛遗漏集有多种格式,但是大多数R函数都喜欢某种格式类型。这种首选格式称为 整洁 具有以下特点:

  1. 每variable is saved in its own column.
  2. 每obervation is saved in its own row.
  3. 每“type”观测值存储在单个表中。

这是一个整洁的一定牛遗漏集(使用EDAWR软件包中的免费一定牛遗漏)的样子:

devtools::install_github("rstudio/EDAWR")
library(EDAWR)
storms
Source: local  一定牛遗漏  frame [6 x 4]

    storm wind pressure       date
1 Alberto  110     1007 2000-08-03
2    Alex   45     1009 1998-07-27
3 Allison   65     1005 1995-06-03
4     Ana   40     1013 1997-06-30
5  Arlene   50     1010 1999-06-11
6  Arthur   45     1010 1996-06-17

如您所见,每个变量(风暴名称,风,压力,日期)都有自己的列,每个观测值都保存在自己的行中。

以下示例显示了来自同一包的非整洁一定牛遗漏集:

cases
   计数 ry  2011  2012  2013
1      FR  7000  6900  7000
2      DE  5800  6000  6200
3      US 15000 14000 13000

The cases 一定牛遗漏 sets has three variables: the 国家代码 在每一行中 在每列中 计数 对于行和列的每种组合。如您所见,该结构没有’不符合上述整洁一定牛遗漏集的特征。

让’我们来看看另一个称为污染的非整洁一定牛遗漏集的示例:

pollution
      city  size amount
1 New York large     23
2 New York small     14
3   London large     22
4   London small     16
5  Beijing large    121
6  Beijing small     56

这里我们有三个变量:城市名称,每个城市拥有的小颗粒数量和大颗粒数量。同样,这不是’符合整洁一定牛遗漏集的特征。下图以图形方式总结了所有三个一定牛遗漏集的结构:

整洁vs混乱一定牛遗漏

整理vs.凌乱一定牛遗漏 R工作室

因此,您现在问自己,整洁的一定牛遗漏有哪些优势?

一定牛遗漏整洁的优点:

为了解释R中整洁的一定牛遗漏格式的优点,我们将看一下如何从上述一定牛遗漏集中提取值。让’s start with the 整洁 一定牛遗漏 set storms. If you for example want to extract the storm names and pressure, this is the straight forward and works like this:

storms$storm
storm$pressure

第二个示例显示了“untidy” pollution 一定牛遗漏 set. If we want to extract its city names or amounts of all large particles, the code already looks much messier and more complex:

pollution$city[1,3,5]
pollution$amount[2,4,6]

您可以看到,整洁的一定牛遗漏集可以自动提取始终遵循相同模式的值。对于不整洁的一定牛遗漏,这种自动化并非总是可能的。想象一下,例如具有数千个观测值的大型一定牛遗漏集,这里的值提取将很快变得非常复杂且耗时。简而言之:整齐的格式是操作R的最有效方法。

如何整理一定牛遗漏?

So how do I make my 一定牛遗漏 set 整洁 , you ask? A very nice package that is able to clean up your 一定牛遗漏 is called 提迪尔 . Its main purpose is to reshape the layout of 一定牛遗漏框 s where two main functions come to its use:   收集() and 传播() .

收集()

如果我们查看此功能的文档,则会发现:“当您发现自己的列不是变量时,可以使用collect()。” This statement applies to the cases 一定牛遗漏 set described above.  So let`s try to make it 整洁 by using the 收集() function.

 整洁 .cases <- gather(cases, " 年 ", "n", 2:4)

让s compare the resulting 一定牛遗漏框 to the initial 一定牛遗漏框 :

#Inital DF: cases
   计数 ry  2011  2012  2013
1      FR  7000  6900  7000
2      DE  5800  6000  6200
3      US 15000 14000 13000


#Tidy DF:  整洁 .cases
   计数 ry  年      n
1      FR 2011  7000
2      DE 2011  5800
3      US 2011 15000
4      FR 2012  6900
5      DE 2012  6000
6      US 2012 14000
7      FR 2013  7000
8      DE 2013  6200
9      US 2013 13000

The result is a 整洁 一定牛遗漏框 with three columns, where every column represents a variable and every obeservation is saved in its own row. The following picture below gives an insight how the 收集() function works in detail:

 

collect()-RStudio的Tidyr

收集()– 提迪尔 by RStudio

传播()

The second main function from 提迪尔 is 传播() . This function takes 一定牛遗漏 that is in a key-value format and returns a rectangular 整洁 cell format. This may sound confusing, so lets apply this function on the pollution 一定牛遗漏框 to illustrate its functionality:

 整洁 .pollution <- spread(polution, size, amount)

让`s again compare the resulting 整洁 一定牛遗漏框 to the initial 一定牛遗漏框 :

#Initial DF: pollution
      city  size amount
1 New York large     23
2 New York small     14
3   London large     22
4   London small     16
5  Beijing large    121
6  Beijing small     56

#Tidy DF:  整洁 .pollution
      city large small
1  Beijing   121    56
2   London    22    16
3 New York    23    14

As you can see 传播() restructures the 一定牛遗漏框 by removing redundant rows without losing any information. The following picture below gives an insight how the 传播() function works in detail:

传播-Tidyr由RStudio

传播– 提迪尔 by RStudio

总览– gather vs. spread

If you paid close attention in the sections above, you maybe noticed that 收集() and 传播() actually do the opposite of each other. As 收集() is used to tranform a 一定牛遗漏框 from a cell format to a 整洁 key-value format, 传播() makes the transition from a cell format to a 整洁 key-value format. The picture below summarises this:

 RStudio 传播与收集

传播与聚集 RStudio

你不’不必在每次使用它们时将这两个函数应用于相同的列。这意味着,通过将这些参数迭代到具有不同参数的函数,您可以获取相同的一定牛遗漏并将其布局重塑为分析所需的正确格式。

提迪尔 的其他有用功能– separate & unite

Two other useful functions form 整洁 are unite() and separate(). To show their use, lets look at the storms 一定牛遗漏框 again:

    storm wind pressure       date
1 Alberto  110     1007 2000-08-03
2    Alex   45     1009 1998-07-27
3 Allison   65     1005 1995-06-03
4     Ana   40     1013 1997-06-30
5  Arlene   50     1010 1999-06-11
6  Arthur   45     1010 1996-06-17

separate() 可以通过使用分隔符将一列分为多个其他列。让’例如,例如,我们需要三个独立的列,而不是单个列中的日期格式YYYY-MM-DD:一个包含年,一个包含月,一个包含日。这可以通过以下命令来实现:

#create new df with 3 new columns " 年 ", "month", "day" out of the inital "date" column
storms.sep <- separate(storms, date, c(" 年 ", "month", "day"), sep="-")

    storm wind pressure  年  month day
1 Alberto  110     1007 2000    08  03
2    Alex   45     1009 1998    07  27
3 Allison   65     1005 1995    06  03
4     Ana   40     1013 1997    06  30
5  Arlene   50     1010 1999    06  11
6  Arthur   45     1010 1996    06  17

unite() does the exact opposite. It unites multiple columns into a single column. This can be demonstrated using our newly created storms.sep 一定牛遗漏框 :

#unite the columns 4:6 into a new column
unite(storms.sep, "date" , 4:6 , sep ="-")

    storm wind pressure       date
1 Alberto  110     1007 2000-08-03
2    Alex   45     1009 1998-07-27
3 Allison   65     1005 1995-06-03
4     Ana   40     1013 1997-06-30
5  Arlene   50     1010 1999-06-11
6  Arthur   45     1010 1996-06-17

I hope you enjoyed the brief introduction into the 提迪尔 package and I would be happy if you will apply some of the mentioned functions in your next 一定牛遗漏 processing work to make it more efficent and time saving.
The next part will be on dplyr and the %>% operator. Hope to see you soon!

干杯
马丁

关于作者

马丁出生于捷克共和国,就读于维也纳自然资源与生命科学大学。他目前在GeoVille(一家位于奥地利的地球观测公司)工作,专门从事土地监测。他的主要兴趣是:开源应用程序,例如R,(地理空间)统计和一定牛遗漏管理,Web映射和可视化。他喜欢旅行,寻宝,摄影和运动。

4条留言

您可以在这篇文章中发表评论。


  • 嗨,非常有用的资源,

    我在使用自己的函数对整洁的spread()运算符有疑问/问题,以免看到下面的示例。

    my_summarise%
    group_by(!! group_var1,!! group_var2)%>%
    摘要(CR =平均值(a))%>%
    传播(!! group_var2,CR)
    }

    然后,当我们编写函数时,我们必须使用quo()运算符,

    my_summarise(df = Data_S,quo(Age),quo(segment))

    并适用于group_by区域(diplyr),但不适用于spread(),我们得到以下错误

    错误:无效的列规格

    有帮助吗?

    提前致谢

    贡扎洛 3年前 回复


  • 嗨,

    Great Post和博客文章的最佳选择是吸引人们参与。

    查尔斯 2年前 回复


  • 感谢使用R进行一定牛遗漏管理的精彩文章,我认为这对我有所帮助。

    一定牛遗漏转换服务 2年前 回复


  • 嗨,我是Peter ross,我在美国经营业务。您发布的博客内容非常丰富,请继续发布此类信息。我想从您那里了解更多。

    彼得·罗斯 8个月前 回复


发表回复

*