pivot_wider, подсчитать количество вхождений - PullRequest
0 голосов
/ 18 июня 2020

Простой вопрос. Я хотел бы использовать pivot_wider в наборе данных для подсчета количества вхождений каждой категории:


Вот пример с mtcars данных (где я группирую их по цилиндрам, а затем подсчитываю появления различных углеводов)

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 ]

4 голосов
/ 18 июня 2020

Вы можете использовать аргумент values_fn для pivot_wider, который играет ту же роль, что и fun.aggregate в dcast.

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

Обратите внимание, что вам нужно выбрать столбец (произвольно, я выбрал am) и укажите values_fn в качестве именованного списка (говоря, что вы хотите взять длину этого столбца). Это именованный список, потому что в других случаях вы можете агрегировать несколько столбцов.

1 голос
/ 18 июня 2020

Я понимаю, что вы ищете ответ 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
...