5

我试图找出包gather中的参数tidyr

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

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)

我很好奇最后一行:
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

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

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

编辑 下面的很好的答案,下面的很好的讨论,对于想要更多关于tidyr包的哲学和使用信息的人来说,一定要阅读这篇论文,尽管小插图没有解释语法。

4

1 回答 1

11

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

...参数还可以采用-列名,如您所示的示例中所示。这基本上是说“收集除此之外的所有列”。中的另一种速记方法gather包括使用冒号指定列范围,例如gather(stocks, stock, price, X:Z).

您可以gather通过melt查看函数的代码来进行比较。这是前几行:

> 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)
于 2015-01-25T06:07:20.747 回答