在tidyr中,函数"聚集"使用什么标准来将数据帧从宽到长映射?

Mat*_*ien 5 r dataframe reshape2 tidyr

我试图找出论据gathertidyr包.

我查看了文档,语法如下:

gather(data, key, value, ..., na.rm = FALSE, convert = FALSE)

帮助文件中有一个示例:

stocks <- data.frame(
  time = as.Date('2009-01-01') + 0:9,
  X = rnorm(10, 0, 1),
  Y = rnorm(10, 0, 2),
  Z = rnorm(10, 0, 4)
)

gather(stocks, stock, price, -time)
Run Code Online (Sandbox Code Playgroud)

我对最后一行感到好奇:
gather(stocks, stock, price, -time)

在这里,stocks显然是我们想要修改的数据,这很好.

所以我可以读取它stock并且price是键值对的参数 - 但是这个函数如何决定如何选择列来创建这个键值对?原始数据框如下所示:

time        X            Y          Z
2009-01-01  1.10177950  -1.1926213  -7.4149618
2009-01-02  0.75578151  -4.3705737  -0.3117843
2009-01-03  -0.23823356 -1.3497319  3.8742654
2009-01-04  0.98744470  -4.2381224  0.7397038
2009-01-05  0.74139013  -2.5303960  -5.5197743
Run Code Online (Sandbox Code Playgroud)

我没有看到任何迹象表明我们应该使用任何组合X,YZ.当我使用这个函数时,我觉得我只是选择了我希望长格式数据框中的列的名称,并祈祷它gather神奇地起作用.想想看,我用的时候也有同感melt.

gather看列的类型?它如何从宽到长映射?

编辑 下面的好答案,下面的讨论,以及任何其他想要了解更多关于包的理念和使用的信息的人都tidyr应该阅读本文,尽管插图并没有解释语法.

A5C*_*2T1 11

在"tidyr"中,您可以gather...参数中指定度量变量.这在概念上有点不同melt,其中许多示例(甚至SO上的许多答案)将显示id.vars参数的使用(假设任何未指定为ID的是测量).

...说法也可以采取-列名,如例子中,你表现出来了.这基本上是为了"收集除此之外的所有列".另一种简写方法gather包括使用冒号指定一系列列,例如gather(stocks, stock, price, X:Z).

你可以比较gathermelt通过查看该函数的代码.以下是前几行:

> tidyr:::gather_.data.frame
function (data, key_col, value_col, gather_cols, na.rm = FALSE, 
    convert = FALSE) 
{
    data2 <- reshape2::melt(data, measure.vars = gather_cols, 
        variable.name = key_col, value.name = value_col, na.rm = na.rm)
Run Code Online (Sandbox Code Playgroud)

  • @DavidArenburg的观点是`gather()`一般来说,人们更容易理解,而且它与`spread()`对称(不像`melt()`和`cast()`) (3认同)