在 tidyr 中,函数 `gather` 使用什么标准将数据帧从宽映射到长?
In tidyr, what criteria does the function `gather` use to map a dataframe from wide to long?
我正在尝试找出 tidyr
包中 gather
的参数。
我查看了文档,语法如下:
gather(data, key, value, ..., na.rm = FALSE, convert = FALSE)
帮助文件里有个example:
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
是键值对的参数——但是这个函数如何决定如何 select 列来创建这个键值对?原始数据框如下所示:
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
包的哲学和使用的信息,绝对应该阅读这个 paper,尽管小插图没有解释语法。
在 "tidyr" 中,您在 ...
参数中指定 gather
的度量变量。这在概念上与 melt
有点不同,其中许多示例(甚至这里的许多答案)都会显示 id.vars
参数的使用(假设任何未指定为 ID是测量值)。
...
参数也可以采用 -
列名,如您所展示的示例所示。这基本上是说 "gather all of the columns except for this one"。 gather
中的另一种 shorthand 方法包括使用冒号指定列的范围,例如 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)
我正在尝试找出 tidyr
包中 gather
的参数。
我查看了文档,语法如下:
gather(data, key, value, ..., na.rm = FALSE, convert = FALSE)
帮助文件里有个example:
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
是键值对的参数——但是这个函数如何决定如何 select 列来创建这个键值对?原始数据框如下所示:
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
包的哲学和使用的信息,绝对应该阅读这个 paper,尽管小插图没有解释语法。
在 "tidyr" 中,您在 ...
参数中指定 gather
的度量变量。这在概念上与 melt
有点不同,其中许多示例(甚至这里的许多答案)都会显示 id.vars
参数的使用(假设任何未指定为 ID是测量值)。
...
参数也可以采用 -
列名,如您所展示的示例所示。这基本上是说 "gather all of the columns except for this one"。 gather
中的另一种 shorthand 方法包括使用冒号指定列的范围,例如 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)