R: суммирование одного столбца на основе условий

avatar
NewToThisRThing
8 апреля 2018 в 00:35
34
1
1

У меня есть набор данных, который (с помощью этого сайта) создал подсчет на основе 3 экземпляров:

  1. Число Plans, где Coins больше 20
  2. Число Plans, где Coins равно 20
  3. Число Plans, где Coins меньше 20

Вот пример из гораздо большего набора данных

Plan    Year   Coins   Copay   Enrollment
  A     2018     20      10       200
  B     2014     15       5       100
  C     2012     30       0        50
  D     2017     30      10       350
  E     2018     5       10       400
  F     2018     20       0       150
  G     2018     20       0       200
  H     2016     20      10       800
  I     2014     10       3       250
  J     2017     20       7       550

Это было достигнуто за счет:

df %>%
   group_by(grp = case_when(Coins < 20 ~ 'grp1', Coins ==20 ~ 'grp2', TRUE ~ 'grp3')) %>%
   summarise(Plan = toString(unique(Plan)), prop = n()) %>%
   ungroup %>%
   select(-grp)

Чтобы получить:

  1. С, Д - 2
  2. A, F, G, H, J - 5
  3. Б, Е, И - 3

Теперь я хотел бы включить столбец Enrollment и суммировать на основе трех условий выше. Таким образом, я хотел бы добиться следующих показателей:

  1. 400 (50+350)
  2. 1900 (200+150+200+800+550)
  3. 750 (100+400+250)
Источник

Ответы (1)

avatar
Maurits Evers
8 апреля 2018 в 00:42
1

Вы можете добавить сводку counts = sum(Enrollment) перед ungroupингом.

library(tidyverse);
df %>%
    group_by(grp = case_when(Coins < 20 ~ 'grp1', Coins ==20 ~ 'grp2', TRUE ~ 'grp3')) %>%
    group_by(grp) %>%
    summarise(
        Plan = toString(unique(Plan)),
        prop = n(),
        counts = sum(Enrollment)) %>%
    ungroup() %>%
    select(-grp);
## A tibble: 3 x 4
#  Plan           prop counts
#  <chr>         <int>  <int>
#1 B, E, I           3    750
#2 A, F, G, H, J     5   1900
#3 C, D              2    400

Пример данных

df <- read.table(text =
    "Plan    Year   Coins   Copay   Enrollment
  A     2018     20      10       200
  B     2014     15       5       100
  C     2012     30       0        50
  D     2017     30      10       350
  E     2018     5       10       400
  F     2018     20       0       150
  G     2018     20       0       200
  H     2016     20      10       800
  I     2014     10       3       250
  J     2017     20       7       550", header = T)
NewToThisRThing
8 апреля 2018 в 00:47
0

Да! Большое спасибо - ответ был прямо передо мной (проверьте мое имя пользователя). Еще один вопрос: в настоящее время я получаю результат, который выглядит примерно так: 6.33e5 - как я могу вернуть точное значение?

Maurits Evers
8 апреля 2018 в 00:55
0

@NewToThisRThing Я считаю, что именно так tibble форматирует большое число при печати; значение по-прежнему точное. Вы можете добавить %>% as.data.frame() в конец вашей цепочки magrittr для вывода значений "data.frame".