【问题标题】:pivot_wider, count number of occurrencespivot_wider,计数出现次数
【发布时间】:2020-06-17 23:08:59
【问题描述】:

简单的问题。我想在数据集上使用 pivot_wider 来计算每个类别的出现次数:


这是数据 mtcars 的示例(我将它们按 cyl 分组,然后计算不同碳水化合物的出现次数)

mtcars %>%
  dplyr::group_by(cyl,carb) %>%
  dplyr::summarize(sum=n()) %>%
  pivot_wider(id_cols="cyl",names_from="carb",values_from="sum")

# A tibble: 3 x 7
# Groups:   cyl [3]
    cyl   `1`   `2`   `4`   `6`   `3`   `8`
  <dbl> <int> <int> <int> <int> <int> <int>
1     4     5     6    NA    NA    NA    NA
2     6     2    NA     4     1    NA    NA
3     8    NA     4     6    NA     3     1

有没有办法让我直接使用“pivot_wider”来执行此操作?我可以用“dcast”来做到这一点

mtcars %>%
  dcast(cyl~carb,fun.aggregate=length)

Using carb as value column: use value.var to override.
  cyl 1 2 3 4 6 8
1   4 5 6 0 0 0 0
2   6 2 0 0 4 1 0
3   8 0 4 3 6 0 1

...但我喜欢在很多其他事情上使用“pivot_wider”(它的语法对我来说很有意义)。

谢谢!

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

    您可以将values_fn 参数用于pivot_wider,其作用与dcast 中的fun.aggregate 相同。

    mtcars %>%
        pivot_wider(id_cols = "cyl",
                    names_from = "carb",
                    values_from = "am",
                    values_fn = list(am = length))
    

    请注意,您必须选择一列(随意,我选择了am),并将values_fn 作为命名列表(假设您要获取该列的长度)。这是一个命名列表,因为在其他用例中您可能会聚合多个列。

    【讨论】:

    • 谢谢,这样就可以了!
    【解决方案2】:

    我知道您正在寻找tidyr::pivot_wider 的答案,但在这种情况下,您可以使用table 来获得预期的输出。

    with(mtcars,table(cyl, carb))
    
    #    1 2 3 4 6 8
    #  4 5 6 0 0 0 0
    #  6 2 0 0 4 1 0
    #  8 0 4 3 6 0 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      相关资源
      最近更新 更多