#r #dplyr
Вопрос:
Я хочу добавить столбец, чтобы найти соотношение элементов, которые делятся на общее количество элементов одного и того же типа,например, (тип, жанр)=(1,0), соотношение будет n/сумма(того же типа)=2/3
coco<-data.frame(type=c(1,2,1,2,3,1,2,3,4,4),genre=c(0,1,0,1,1,1,0,0,1,0))
coco%>%group_by(type,genre)%>%summarise(n=n())
# A tibble: 8 x 3
# Groups: type [4]
type genre n
<dbl> <dbl> <int>
1 1 0 2
2 1 1 1
3 2 0 1
4 2 1 2
5 3 0 1
6 3 1 1
7 4 0 1
8 4 1 1
coco%>%count(type)
type n
1 1 3
2 2 3
3 3 2
4 4 2
Я пытался использовать:
coco%>%group_by(type,genre)%>%summarise(n=n(),ratio=n/sum(type))
но не сработало, это должно быть напечатано так:
type genre n ratio
<dbl> <dbl> <int>
1 1 0 2 0.66
2 1 1 1 0.33
3 2 0 1 0.33
4 2 1 2 0.66
5 3 0 1 0.5
6 3 1 1 0.5
7 4 0 1 0.5
8 4 1 1 0.5
Могу я спросить, какую часть мне следует изменить? (Извините за плохое объяснение и заранее благодарю)
Комментарии:
1. Не могли бы вы поделиться воспроизводимой частью ваших данных?
2. кокос
Ответ №1:
Кратчайший путь для group_by(x) %>% summarize(n = n())
этого count(x)
.
Ваш код будет работать, если вы измените его на
coco%>%group_by(type,genre)%>%summarise(n=n()) %>% mutate(ratio=n/sum(n))
Строка подведения итогов оставляет type
группировку нетронутой, и в этот момент вы можете ввести ее в то mutate
место, где вы сравниваете ее n
с общей n
суммой для этой группы type
.
Вот еще один способ, который я немного предпочитаю, так type
как группировка написана явно. (Я и раньше совершал ошибки, не понимая, какой уровень группировки остался после group_by - summarize
…)
coco %>%
count(type, genre) %>%
group_by(type) %>%
mutate(ratio = n / sum(n)) %>%
ungroup()
# A tibble: 8 x 4
type genre n ratio
<dbl> <dbl> <int> <dbl>
1 1 0 2 0.667
2 1 1 1 0.333
3 2 0 1 0.333
4 2 1 2 0.667
5 3 0 1 0.5
6 3 1 1 0.5
7 4 0 1 0.5
8 4 1 1 0.5
Комментарии:
1. Я понял ваш код, большое вам спасибо. ~
Ответ №2:
Вам нужно разделить n на сумму подсчета(n), чтобы получить желаемые результаты, потому что данные не были сгруппированы только по типу
пожалуйста, проверьте мой код
coco %>% group_by(type,genre) %>%
summarise(n=n(), ) %>%
mutate(ratio = n/sum(n))
Ответ №3:
Надеюсь, я правильно понял, что ты имеешь в виду:
coco %>%
add_count(type) %>%
arrange(type) %>%
group_by(genre, type) %>%
mutate(avg = n() / n)
# A tibble: 10 x 4
# Groups: genre, type [8]
type genre n avg
<dbl> <dbl> <int> <dbl>
1 1 0 3 0.667
2 1 0 3 0.667
3 1 1 3 0.333
4 2 1 3 0.667
5 2 1 3 0.667
6 2 0 3 0.333
7 3 1 2 0.5
8 3 0 2 0.5
9 4 1 2 0.5
10 4 0 2 0.5
Комментарии:
1. спасибо за помощь ~ Я знаю, как изменить свой код 🙂