如何基于存储区中R中的值获取计数

时间:2019-04-05 10:41:14

标签: r dataframe dplyr

我在下面提到了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

我想学习如何在给定的所需数据帧以下转换数据帧,其中ABC对于每个日期都应该是静态的,无论该特定类型是否为该日期是否可用。

此外,我想在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 :(得分:0)

某些步骤可以进一步简化,但可以进行以下工作。

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

数据

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)