R: как найти соотношение при использовании dplyr

#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. спасибо за помощь ~ Я знаю, как изменить свой код 🙂