首页 > 解决方案 > 统计 ABC 的 XXXX 后查询日期的所有条目必须除以它们的用途,groupby() 和数据的详细信息

问题描述

我打算列出在查询 ABC 后查询的每个 ID 的所有用途(其中 XXXX 表示其他公司)。样本表如下:

     ID            Company  INQUIRY-DATE Purpose
    A15217177635833 XXXX    25-08-2018   X
    A15217177635833 ABC     28-06-2018   Y
    A15217177635833 XXXX    05-05-2018   Z
    A15217177635833 XXXX    28-05-2019   A
    F15039820795577 ABC     22-08-2017   X
    F15039820795577 XXXX    15-06-2017   Y
    F15039820795577 XXXX    15-08-2018   Z
    F15039820795577 XXXX    25-08-2018   Z
    F15039820795577 XXXX    15-08-2018   A

预期输出:

     ID             Count_Z  Count_A
    A15217177635833 1         1
    F15039820795577 2         1

即 ABC 的 XXXX 后查询日期的所有条目的计数必须除以它们的用途。我尝试使用 group by 和 mutate(count_z) 但没有运气。

我不确定如何在分组后获取详细数据,因为据我所知,分组是与摘要一起使用的。

标签: r

解决方案


我们首先转换INQUIRY-DATE为日期对象,每个组arrange的数据只选择第一次出现之后的那些行,计算每个,然后以宽格式传播数据。IDINQUIRY-DATE"ABC"Purpose

library(dplyr)

df %>%
   mutate(`INQUIRY-DATE` = as.Date(`INQUIRY-DATE`, "%d-%m-%Y")) %>%
   arrange(ID, `INQUIRY-DATE`) %>%
   group_by(ID) %>%
   filter(Company != "ABC" & row_number() > match("ABC", Company)) %>%
   count(ID, Purpose) %>%
   tidyr::pivot_wider(names_from = Purpose, values_from = n, 
                      values_fill = list(n = 0))

#  ID                  A     X     Z
#  <fct>           <int> <int> <int>
#1 A15217177635833     1     1     0
#2 F15039820795577     1     0     2

数据

df <- structure(list(ID = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L), .Label = c("A15217177635833", "F15039820795577"), class = "factor"), 
Company = structure(c(2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L), .Label = c("ABC", 
"XXXX"), class = "factor"), `INQUIRY-DATE` = structure(c(5L, 
7L, 1L, 6L, 4L, 2L, 3L, 5L, 3L), .Label = c("05-05-2018", 
"15-06-2017", "15-08-2018", "22-08-2017", "25-08-2018", "28-05-2019", 
"28-06-2018"), class = "factor"), Purpose = structure(c(2L, 
3L, 4L, 1L, 2L, 3L, 4L, 4L, 1L), .Label = c("A", "X", "Y", 
"Z"), class = "factor")), class = "data.frame", row.names = c(NA, -9L))

推荐阅读