【问题标题】:How to get count based on buckets the values in R如何根据桶获取R中的值
【发布时间】:2019-04-05 10:41:14
【问题描述】:

我在下面提到了 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 对于每个日期都应该是静态的,无论该特定类型在该日期是否可用.

另外,我想按日期和Type统计<5的桶中的ID(如果值在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))

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

【问题讨论】:

  • 混合日期和因子水平可能不是最干净的解决方案。我猜你需要这个只是为了演示目的是正确的吗?如果没有,您可能不得不考虑使用另一个名为 Type 的变量。
  • 用户@VectorJX 有一个nearly identical question,后来被删除了。巧合?一样的课程?同一用户?

标签: r dataframe dplyr


【解决方案1】:

一些步骤可以进一步简化,但以下是可行的。

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)

【讨论】:

  • 我的数据框的计数不正确,我还需要使存储桶(即&lt;55-10&gt;10)静态,无论值是否属于该存储桶那天与否。
  • 我认为我的输出与您想要的输出相同?
  • 是的,对于样本数据来说它工作正常,但是当使用大数据时它给出错误的计数,我也尝试在summarize 中使用count = n(ID)
  • 由于我的解决方案适用于您的示例数据集,这意味着您的示例数据集和实际数据集之间存在一些关键差异。您有责任找出关键差异。
  • 谢谢,我正在努力解决。
猜你喜欢
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
相关资源
最近更新 更多