pivot_wider,计算出现次数

6

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


这里有一个例子,使用mtcars数据(我按cyl进行分组,然后计算不同carbs的出现次数):

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'来做许多其他事情(它的语法对我来说很有意义)。

谢谢!

2个回答

13
你可以使用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作为一个命名列表(表示您想要取该列的长度)。它是一个命名列表,因为在其他用例中,您可能正在聚合多个列。


5

我知道你在寻找 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接