Как подсчитать на основе сегментов значения в R - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть упомянутый ниже фрейм данных в R.

ID       Date         Type         Value
K-1      2018-01-01   A            4
K-2      2018-01-01   B            7
K-3      2018-01-01   C            12
K-4      2018-01-02   A            6
K-5      2018-01-02   A            4
K-6      2018-01-02   B            15
K-7      2018-01-02   B            10

Я хочу узнать, как преобразовать фрейм данных в нижеприведенный требуемый фрейм данных, где A, B и C должны быть статическимидля каждой даты, независимо от того, доступен ли этот конкретный тип или нет на эту дату.

Кроме того, я хочу посчитать группу ID по дате и Type в сегменте <5(Если значение от 1 до 4), 5-10 (если значение от 5 до 10) и >10 (если значение больше 10).

sum столбец должен состоять из общегозначения для этой конкретной даты и типа также.

Count столбец должен состоять из количества групп ID на определенную дату и Type.

Обязательный DF

Date           Count      <5      5-10       >10      sum
2018-01-01      3         1        1          1        23
A               1         1        0          0        4
B               1         0        1          0        7
C               1         0        0          1        12
2018-01-02      4         1        2          1        35
A               2         1        1          0        10
B               2         0        1          1        25
C               0         0        0          0        0

Мой код:

Required_Output <- df1 %>%
  group_by(Date, Type) %>%
  dplyr::summarise(Count=n(),
                   A=sum(Type=='A'),
                   B=sum(Type=='B'),
                   C=sum(Type=='C')) %>%
  ungroup() %>%
  complete(Date, Type, fill=list(`Count`=0,A=0, B=0, C=0))

Приведенный выше код не дал мне желаемого результата: (

1 Ответ

0 голосов
/ 05 апреля 2019

Некоторые шаги могут быть еще более упрощены, но следующие работы.

library(tidyverse)

dat2 <- dat %>%
  mutate(Result = case_when(
    Value < 5                        ~"<5",
    Value >= 5 & Value <= 10         ~"5-10",
    Value > 10                       ~">10"
  )) %>%
  group_by(Date, Type, Result) %>%
  summarize(sum = sum(Value)) %>%
  mutate(Flag = 1L) %>%
  spread(Result, Flag, fill = 0L) %>%
  group_by(Date, Type) %>%
  summarize_all(list(~sum(.))) %>%
  ungroup() %>%
  complete(Date, Type)

dat2[is.na(dat2)] <- 0

dat3 <- dat2 %>% mutate(Count = rowSums(select(., -Date, -Type, -sum)))

dat4 <- dat3 %>%
  group_by(Date) %>%
  summarize_at(vars(-Type), list(~sum(.))) 

dat_final <- map2_dfr(split(dat4, f = dat4$Date),
                      split(dat3, f = dat3$Date),
                      ~bind_rows(.x %>% rename(Type = Date), 
                                 .y %>% select(-Date)))

dat_final2 <- dat_final %>%
  select(Date = Type, Count, `<5`, `5-10`, `>10`, sum)
dat_final2
# # A tibble: 8 x 6
#   Date       Count  `<5` `5-10` `>10`   sum
#   <chr>      <dbl> <dbl>  <dbl> <dbl> <dbl>
# 1 2018-01-01     3     1      1     1    23
# 2 A              1     1      0     0     4
# 3 B              1     0      1     0     7
# 4 C              1     0      0     1    12
# 5 2018-01-02     4     1      2     1    35
# 6 A              2     1      1     0    10
# 7 B              2     0      1     1    25
# 8 C              0     0      0     0     0

DATA

dat <- read.table(text = "ID       Date         Type         Value
'K-1'      '2018-01-01'   A            4
'K-2'      '2018-01-01'   B            7
'K-3'      '2018-01-01'   C            12
'K-4'      '2018-01-02'   A            6
'K-5'     '2018-01-02'   A            4
'K-6'      '2018-01-02'   B            15
'K-7'      '2018-01-02'   B            10",
                  header = TRUE, stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...