【问题标题】:Pivot wider produces nested object枢轴更宽会产生嵌套对象
【发布时间】:2020-01-16 04:12:28
【问题描述】:

这是关于最新的tidyr 版本。我正在尝试来自library(tidyr) 的pivot_wider 和pivot_longer 函数(更新1.0.0)

当我在下面运行时,我试图获取正常的 iris 数据集,但我得到了嵌套的 3X5 尺寸小标题,不确定发生了什么(我阅读了https://tidyr.tidyverse.org/articles/pivot.html)但仍然不确定如何避免这种情况

library(tidyr)
iris %>% pivot_longer(-Species,values_to = "count") %>% 
pivot_wider(names_from = name, values_from = count)

预期输出:正常 Iris 数据集(150 X 5 维度)

编辑:我在下面读到,如果我环绕 unnest() 我会得到预期的输出。当我们没有将它嵌套在任何地方时,我无法理解为什么要取消它。任何基本的帮助将不胜感激。想了解问题的概念。

【问题讨论】:

    标签: r dataframe tidyverse tidyr


    【解决方案1】:

    我从 Akrun 和其他乐于助人的朋友那里了解到并发布 (不是错误或任何东西)

    spread(., name, count) 会引发错误,因为每个物种 x 名称都有多行。 pivot_wider 通过提供列表列做得更好。如果我们为每一行添加唯一 ID,那么它就可以正常工作。

    library(tidyverse)
    
    iris %>%
      rowid_to_column() %>% 
      pivot_longer(-c(rowid, Species), values_to = "count") %>%
      pivot_wider(names_from = name, values_from = count) %>% 
      select(-rowid)
    

    【讨论】:

    • 特别感谢 @Akrun 帮我解决这个问题,不知道为什么你删除了你非常有用的答案
    • 我刚刚查看了您的个人资料。很好的答案!继续努力!
    【解决方案2】:

    pivot_wider() 与 nest() 不同,它允许我们在未为行指定唯一标识符时聚合多个值。

    默认使用list 进行聚合并对其进行详细说明。

    要扩展输出,我们可以使用unnest(),正如已经建议的那样,但使​​用unchop() 更为惯用,因为我们不尝试扩展嵌套值中的水平维度。

    因此,总结所有这些以取回您的初始数据(除非它是一个小标题),您可以这样做:

    library(tidyr)
    iris %>% 
      pivot_longer(-Species,values_to = "count") %>% 
      print() %>%
      pivot_wider(names_from = name, 
                  values_from = count, 
                  values_fn = list(count=list)) %>%
      print() %>%
      unchop(everything()) %>%
      print() %>%
      all.equal(iris)
    #> # A tibble: 600 x 3
    #>    Species name         count
    #>    <fct>   <chr>        <dbl>
    #>  1 setosa  Sepal.Length   5.1
    #>  2 setosa  Sepal.Width    3.5
    #>  3 setosa  Petal.Length   1.4
    #>  4 setosa  Petal.Width    0.2
    #>  5 setosa  Sepal.Length   4.9
    #>  6 setosa  Sepal.Width    3  
    #>  7 setosa  Petal.Length   1.4
    #>  8 setosa  Petal.Width    0.2
    #>  9 setosa  Sepal.Length   4.7
    #> 10 setosa  Sepal.Width    3.2
    #> # ... with 590 more rows
    #> # A tibble: 3 x 5
    #>   Species    Sepal.Length Sepal.Width Petal.Length Petal.Width
    #>   <fct>       <list<dbl>> <list<dbl>>  <list<dbl>> <list<dbl>>
    #> 1 setosa             [50]        [50]         [50]        [50]
    #> 2 versicolor         [50]        [50]         [50]        [50]
    #> 3 virginica          [50]        [50]         [50]        [50]
    #> # A tibble: 150 x 5
    #>    Species Sepal.Length Sepal.Width Petal.Length Petal.Width
    #>    <fct>          <dbl>       <dbl>        <dbl>       <dbl>
    #>  1 setosa           5.1         3.5          1.4         0.2
    #>  2 setosa           4.9         3            1.4         0.2
    #>  3 setosa           4.7         3.2          1.3         0.2
    #>  4 setosa           4.6         3.1          1.5         0.2
    #>  5 setosa           5           3.6          1.4         0.2
    #>  6 setosa           5.4         3.9          1.7         0.4
    #>  7 setosa           4.6         3.4          1.4         0.3
    #>  8 setosa           5           3.4          1.5         0.2
    #>  9 setosa           4.4         2.9          1.4         0.2
    #> 10 setosa           4.9         3.1          1.5         0.1
    #> # ... with 140 more rows
    #> [1] TRUE
    

    由reprex package (v0.3.0) 于 2019 年 9 月 15 日创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多