Предположим, я хочу рассчитать долю различных значений в каждой группе. Например, используя mtcars
данные, как рассчитать относительную частоту числа передач с помощью am (автоматически / вручную) за один раз dplyr
?
library(dplyr)
data(mtcars)
mtcars <- tbl_df(mtcars)
# count frequency
mtcars %>%
group_by(am, gear) %>%
summarise(n = n())
# am gear n
# 0 3 15
# 0 4 4
# 1 4 8
# 1 5 5
Чего бы я хотел достичь:
am gear n rel.freq
0 3 15 0.7894737
0 4 4 0.2105263
1 4 8 0.6153846
1 5 5 0.3846154
prop.table()
/sweep()
. Кроме того, в других вопросах некоторые люди просят опцию включения нулевого счета для переменных или переменных-взаимодействийОтветы:
Попробуй это:
Из виньетки dplyr :
Таким образом, после
summarise
, последняя переменная группировки, указанная вgroup_by
'gear', удаляется. На этомmutate
этапе данные группируются по оставшейся переменной (группам) группировки, здесь «am». Вы можете проверить группировку на каждом шаге с помощьюgroups
.Результат пилинга, конечно, зависит от порядка группировки переменных в
group_by
вызове. Вы можете сделать последующееgroup_by(am)
, чтобы сделать ваш код более явным.Для округления и преттификации, пожалуйста, обратитесь к хорошему ответу @Tyler Rinker.
источник
sum(n)
работает надam
группой, а не надgear
группой ...summarise
как он скажет, какие группы остались. О, dplyr качается ...Вы можете использовать
count()
функцию, которая, однако, имеет другое поведение в зависимости от версииdplyr
:dplyr 0.7.1: возвращает несгруппированную таблицу: вам нужно снова сгруппировать по
am
dplyr <0.7.1: возвращает сгруппированную таблицу, так что нет необходимости снова группировать, хотя вы можете захотеть
ungroup()
для последующих манипуляцийdplyr 0.7.1
dplyr <0.7.1
В результате получается сгруппированная таблица. Если вы хотите использовать ее для дальнейшего анализа, может быть полезно удалить сгруппированный атрибут
ungroup()
.источник
dplyr
0.7.1. Это делает вычисление частоты в целом по «шестерне», а не в пределах каждого уровня «я».@ Henrik's лучше для удобства использования, так как это сделает символ столбца и больше не будет числовым, но будет соответствовать тому, что вы просили ...
РЕДАКТИРОВАТЬ, потому что Spacedman попросил об этом :-)
источник
format
методом, который добавляет знак процента ... #overkillВот общая функция, реализующая решение Хенрика на
dplyr
0.7.1.источник
Error in bind_rows_(x, .id) : Column
am` не может быть преобразован из числового в символьныйЯ написал небольшую функцию для этой повторяющейся задачи:
Я могу тогда использовать это как:
Возвращает:
источник
Несмотря на множество ответов, еще один подход, который использует
prop.table
в сочетании сdplyr
илиdata.table
.источник
Этот ответ основан на ответе Матифу.
Сначала я изменил его, чтобы не возвращать столбец freq в качестве столбца научной нотации с помощью параметра scipen.
Затем я умножаю ответ на 100, чтобы получить процент, а не десятичную дробь, чтобы облегчить чтение столбца freq в процентах.
источник