当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R tidyr gather 将列收集到键值对中


[Superseded]

gather() 的开发已完成,对于新代码,我们建议切换到 pivot_longer() ,它更易于使用,函数更强大,并且仍在积极开发中。 df %>% gather("key", "value", x, y, z) 相当于df %>% pivot_longer(c(x, y, z), names_to = "key", values_to = "value")

请参阅vignette("pivot") 中的更多详细信息。

用法

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

参数

data

一个 DataFrame 。

key, value

新键和值列的名称,作为字符串或符号。

该参数通过表达式传递并支持quasiquotation(您可以取消引用字符串和符号)。该名称是从带有 rlang::ensym() 的表达式中捕获的(请注意,这种符号不代表实际对象的接口现在在 tidyverse 中不鼓励使用;我们在这里支持它是为了向后兼容)。

...

列的选择。如果为空,则选择所有变量。您可以提供裸变量名称,使用 x:z 选择 x 和 z 之间的所有变量,使用 -y 排除 y。有关更多选项,请参阅dplyr::select() 文档。另请参阅下面有关选择规则的部分。

na.rm

如果 TRUE ,将从输出中删除值列为 NA 的行。

convert

如果TRUE会自动在键列上运行type.convert()。如果列类型实际上是数字、整数或逻辑,这非常有用。

factor_key

如果是FALSE(默认值),则键值将存储为字符向量。如果 TRUE ,将被存储为一个因子,这会保留列的原始顺序。

评选规则

选择列的参数被传递到tidyselect::vars_select() 并进行特殊处理。与其他动词不同,选择函数严格区分数据表达式和上下文表达式。

  • 数据表达式可以是像 x 这样的裸名称,也可以是像 x:yc(x, y) 这样的表达式。在数据表达式中,您只能引用 DataFrame 中的列。

  • 其他一切都是上下文表达式,您只能在其中引用使用 <- 定义的对象。

例如,col1:col3 是引用数据列的数据表达式,而 seq(start, end) 是引用上下文中的对象的上下文表达式。

如果需要从数据表达式引用上下文对象,可以使用 all_of()any_of() 。这些函数用于选择名称存储在env-variable中的data-variables。例如, all_of(a) 选择字符向量 a 中列出的变量。有关更多详细信息,请参阅tidyselect::select_helpers() 文档。

例子

# From https://stackoverflow.com/questions/1181060
stocks <- tibble(
  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)
#> # A tibble: 30 × 3
#>    time       stock   price
#>    <date>     <chr>   <dbl>
#>  1 2009-01-01 X      0.0930
#>  2 2009-01-02 X      1.56  
#>  3 2009-01-03 X      0.169 
#>  4 2009-01-04 X     -0.587 
#>  5 2009-01-05 X     -0.356 
#>  6 2009-01-06 X      3.32  
#>  7 2009-01-07 X     -1.10  
#>  8 2009-01-08 X     -0.127 
#>  9 2009-01-09 X     -0.434 
#> 10 2009-01-10 X     -0.0206
#> # … with 20 more rows
stocks %>% gather("stock", "price", -time)
#> # A tibble: 30 × 3
#>    time       stock   price
#>    <date>     <chr>   <dbl>
#>  1 2009-01-01 X      0.0930
#>  2 2009-01-02 X      1.56  
#>  3 2009-01-03 X      0.169 
#>  4 2009-01-04 X     -0.587 
#>  5 2009-01-05 X     -0.356 
#>  6 2009-01-06 X      3.32  
#>  7 2009-01-07 X     -1.10  
#>  8 2009-01-08 X     -0.127 
#>  9 2009-01-09 X     -0.434 
#> 10 2009-01-10 X     -0.0206
#> # … with 20 more rows

# get first observation for each Species in iris data -- base R
mini_iris <- iris[c(1, 51, 101), ]
# gather Sepal.Length, Sepal.Width, Petal.Length, Petal.Width
gather(mini_iris, key = "flower_att", value = "measurement",
       Sepal.Length, Sepal.Width, Petal.Length, Petal.Width)
#>       Species   flower_att measurement
#> 1      setosa Sepal.Length         5.1
#> 2  versicolor Sepal.Length         7.0
#> 3   virginica Sepal.Length         6.3
#> 4      setosa  Sepal.Width         3.5
#> 5  versicolor  Sepal.Width         3.2
#> 6   virginica  Sepal.Width         3.3
#> 7      setosa Petal.Length         1.4
#> 8  versicolor Petal.Length         4.7
#> 9   virginica Petal.Length         6.0
#> 10     setosa  Petal.Width         0.2
#> 11 versicolor  Petal.Width         1.4
#> 12  virginica  Petal.Width         2.5
# same result but less verbose
gather(mini_iris, key = "flower_att", value = "measurement", -Species)
#>       Species   flower_att measurement
#> 1      setosa Sepal.Length         5.1
#> 2  versicolor Sepal.Length         7.0
#> 3   virginica Sepal.Length         6.3
#> 4      setosa  Sepal.Width         3.5
#> 5  versicolor  Sepal.Width         3.2
#> 6   virginica  Sepal.Width         3.3
#> 7      setosa Petal.Length         1.4
#> 8  versicolor Petal.Length         4.7
#> 9   virginica Petal.Length         6.0
#> 10     setosa  Petal.Width         0.2
#> 11 versicolor  Petal.Width         1.4
#> 12  virginica  Petal.Width         2.5
源代码:R/gather.R

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Gather columns into key-value pairs。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。