R Как суммировать две разные группы после начальной group_by - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть следующее, что я хотел бы сделать в одном go вместо двух разных результатов и объединения:

delivery_stats= data.frame(service=c("UberEats", "Seamless","UberEats", "Seamless"),
                            status = c("OnTime", "OnTime", "Late", "Late"),
                            totals = c(235, 488, 32, 58))   

ds1 = filter(delivery_stats, service =="UberEats") %>%
         group_by(service, status) %>% 
         summarise(count_status = sum(totals)) %>%
         mutate(avg_of_status = count_status/sum(count_status))

#now do the same for Seamless, then union...

Ответы [ 3 ]

1 голос
/ 28 февраля 2020

Если я правильно вас понял, вы это имеете в виду?

delivery_stats %>%
    group_by(service) %>%
    mutate(n = sum(totals)) %>%
    transmute(
        status,
        count_status = totals,
        avg_of_status = count_status/n)
## A tibble: 4 x 4
## Groups:   service, status [4]
#  service  status count_status avg_of_status
#  <fct>    <fct>         <dbl>         <dbl>
#1 UberEats OnTime          235         0.880
#2 Seamless OnTime          488         0.894
#3 UberEats Late             32         0.120
#4 Seamless Late             58         0.106

Объяснение: Первая группа по service для расчета суммы totals по service; затем сгруппируйте по service и status, чтобы вычислить среднее (по service) count_status = totals.

0 голосов
/ 28 февраля 2020

Вы также пытаетесь использовать базу R, используя ave с помощью within.

res <- within(delivery_stats, {
  count_status <- ave(totals, service, status, FUN=mean)
  avg_of_status <- count_status / ave(totals, service, FUN=sum)
})
res
#    service status totals avg_of_status count_status
# 1 UberEats OnTime    235     0.8801498          235
# 2 Seamless OnTime    488     0.8937729          488
# 3 UberEats   Late     32     0.1198502           32
# 4 Seamless   Late     58     0.1062271           58
0 голосов
/ 28 февраля 2020

Как уже было сказано выше, мне не нужно было фильтровать, и это работало бы нормально для обеих групп:

delivery_stats= data.frame(service=c("UberEats", "Seamless","UberEats", "Seamless"),
                            status = c("OnTime", "OnTime", "Late", "Late"),
                            totals = c(235, 488, 32, 58))



ds1 =    group_by(delivery_stats, service, status) %>% 
         summarise(count_status = sum(totals)) %>%
         mutate(avg_of_status = count_status/sum(count_status))

# A tibble: 4 x 4
# Groups:   service [2]
  service  status count_status avg_of_status
  <fct>    <fct>         <dbl>         <dbl>
1 Seamless Late             58         0.106
2 Seamless OnTime          488         0.894
3 UberEats Late             32         0.120
4 UberEats OnTime          235         0.880
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...