一个简单的问题。我想在数据集上使用ivot_wider来计算每个类别的出现次数:
以下是数据mtcar的示例(我按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'用于很多其他事情(它的语法对我来说很有意义)。
谢谢!
答案 0 :(得分:5)
您可以在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
作为命名列表(假设您要使用该列的长度)。这是一个命名列表,因为在其他用例中,您可能会聚合多个列。
答案 1 :(得分:3)
我了解您正在寻找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