首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中值的基于桶的计数方法

R中值的基于桶的计数方法
EN

Stack Overflow用户
提问于 2019-04-05 10:41:14
回答 1查看 282关注 0票数 0

下面我已经提到了R.

代码语言:javascript
复制
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对于每个日期都应该是静态的,无论该特定类型在该日期是否可用。

此外,我希望按日期和Type来计算Type组,包括<5 (如果值在1-4之间)、5-10 (如果值在5-10之间)和>10 (如果值大于10)的桶中。

sum列也应该包含特定日期和类型的值总数。

Count列应由按特定日期计算的ID组和Type组成。

所需DF

代码语言:javascript
复制
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

我的代码:

代码语言:javascript
复制
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))

上面的代码没有给我想要的输出:(

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-05 11:15:55

有些步骤可以进一步简化,但以下工作如下。

代码语言:javascript
复制
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

数据

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55533632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档