如何从R中的多个ID获取独占计数和总计数

如何从R中的多个ID获取独占计数和总计数,r,dataframe,dplyr,tidyverse,R,Dataframe,Dplyr,Tidyverse,我在下面提到了R中的数据帧 CusID Date Type LogCat PriceCode C-1 2021-01-02 14:13:10 Demo C-2 2021-01-02 13:17:07 Pro SPR, DET, RTD KR C-2 2021-01-02 14:15:10

我在下面提到了R中的数据帧

CusID     Date                   Type        LogCat             PriceCode
C-1       2021-01-02 14:13:10    Demo                           
C-2       2021-01-02 13:17:07    Pro         SPR, DET, RTD      KR
C-2       2021-01-02 14:15:10    Pro         SPR, DET, RTD      SR
C-2       2021-01-02 16:14:08    Pro         SPR, DET, RTD      DE
C-3       2021-01-02 17:11:03    Pro         DET                KL
C-3       2021-01-02 12:14:24    Pro         DET                ZT
C-3       2021-01-02 12:33:34    Pro         DET                KR
C-4       2021-01-02 10:43:55    Pro                            KR
C-5       2021-01-03 20:23:35    Pro         SPR, RTD           KR
  

Dupt对于第一部分库
门卫
将很有帮助(即使对于第二部分)

第一部分
我在回答中添加了一些评论和解释。我认为这种方法应该有效,但有几点我不清楚:

  • 您需要每个月的摘要,但您的玩具数据只包含2021年1月的日期(我将一个条目更改为至少有两个月的工作时间)

  • 最终的输出格式应该是什么样的?您描述了一个月的
    data.frame
    应该是什么样子,但整个月的最终输出应该是什么样子?我选择了嵌套的
    tible
    ,每个月都有自己的摘要
    data.frame

  • 我假设以
    (All)
    结尾的变量包含所有事件的计数。不以
    “(All)”结尾的变量
    包含类别是唯一提及的情况的计数。这是正确的吗

  • 我不明白最终频率是如何计算的,尤其是对于
    LogCat
    。当将每个类别的计数除以
    CustID
    s的总数时,我得出的数字与您的示例输出的
    PriceCode
    相同。但是,当查看
    LogCat
    的频率时,似乎
    DET(All)
    100%
    (尽管我们有3个
    CustID
    s),这表明所有
    (All)
    变量都显示了一个相对频率,应该始终是
    100%
    DET
    具有计数
    1
    和频率
    50%
    。所以在这种情况下,它似乎是相对计数。但是
    RTD(All)
    的计数为
    1
    ,频率为
    50%
    。这个频率与什么有关?如果
    TYPE!=“演示”
    3

  • 除此之外,下面的代码虽然有点长,但应该可以工作,并且可以很容易地根据其他频率定义进行调整

    设置:

    #该设置包含初始数据,该初始数据经过轻微调整,以使其包含
    #两个不同的月份
    # 
    #我们使用'tidyverse'库和一些自定义的助手函数
    #初始数据:略有更改,因此它包含两个不同的月份
    dat%
    #又不耐烦
    unnest(dat)))
    
    这为我们提供了以下嵌套的tibble

    res1
    #>#tibble:2x2
    #>#罗维:月份
    #>月份数据
    #>                
    #> 1 2021-01 
    #> 2 2021-02 
    
    。。。其中,
    data
    列包含每个月的一个
    data.frame

    res1%>%pull(数据)
    #> [[1]]
    #>#tibble:3 x 3
    #>n型频率
    #>     
    #>1共4 1
    #>2演示1 0.25
    #>3 Pro 3 0.75
    #> 
    #> [[2]]
    #>#tibble:3 x 3
    #>n型频率
    #>     
    #>1总计11
    #>2演示0 0
    #>3亲1 1
    
    要获取第二部分的
    数据帧

    最好使用不同格式的数据,以便
    PriceCode
    包含多个逗号分隔的代码,类似于
    LogCat

    res2a%
    #使用`TYPE==“Demo”`筛选出所有行
    过滤器(类型!=“演示”)%>%
    #添加包含年和月作为字符串的月变量。
    mutate(月=粘贴(substr(日期,1,4),substr(日期,6,7),sep=“-”)%>%
    #按“CustID”和“month”分组`
    分组依据(客户,月份)%>%
    #折叠'PriceCode',使其格式类似于'LogCat'`
    mutate(PriceCode=paste(PriceCode,collapse=“,”)%%>%
    #解组并删除'TYPE'和'DATE'`
    解组()%>%
    选择(!c(类型、日期))
    
    让我们看一下第一步:

    res2a
    #>#A tibble:8 x 4
    #>CustID LogCat价格代码月份
    #>                     
    #>1 C-2“SPR、DET、RTD”KR、SR、DE 2021-01
    #>2 C-2“SPR、DET、RTD”KR、SR、DE 2021-01
    #>3 C-2“SPR、DET、RTD”KR、SR、DE 2021-01
    #>4 C-3“DET”吉隆坡、梓潼、KR 2021-01
    #>5 C-3“DET”吉隆坡、梓潼、KR 2021-01
    #>6 C-3“DET”吉隆坡、梓潼、KR 2021-01
    #>7 C-4 KR 2021-01
    #>8 C-5“SPR,RTD”KR 2021-02
    
    在下一步中,我们将创建最终输出表所需的所有列:

    #首先,我们需要创建命名向量,在'LogCat'和'PriceCode'列上循环`
    #或者,我们可以使用dplyover::crossover()(我在GitHub上维护的一个包)
    logcat_cols%
    strsplit(“,”)%>%
    未列出%>%
    trimws%>%
    唯一%>%
    设置名称(,粘贴0(“LogCat_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    价格代码\u cols%
    strsplit(“,”)%>%
    未列出%>%
    trimws%>%
    唯一%>%
    设置名称(、粘贴0(“价格代码”、“全部”))
    res2b%
    变异(
    #我们需要保存月份和客户ID
    月=月,
    CustID=CustID,
    #这为每个LogCat提供了一个虚拟列
    map_dfc(logcat_cols,~as.integer(grepl(.x,logcat)),
    #这为每个PriceCode提供了一个虚拟列
    map_dfc(pricecode_cols,~as.integer(grepl(.x,pricecode)),
    #让我们创建另一组伪列,检查类别是否是唯一提到的类别
    #我们对LogCat这样做。。。
    跨越(以(“LogCat”)开始,以(“全部”)结束),
    列表(“d”=~if_else(行和(select(cur_data(),以(“LogCat”)开头,以(“(All)”结尾))==0.x&.x==1,1,0)),
    #…对于PriceCode,现在让我们在变量名后面附加一个`_d`作为后缀
    跨越(以(“价格代码”)开始,以(“全部”)结束),
    列表(“d”=~if_else(行和(select(cur_data(),以(“PriceCode”)开始,以(“(All)”)结束)==1,1,0)),
    #让我们为LogCat PriceCode为NA时添加一些最后的列
    跨越(c(LogCat,价格代码),
    ~if_else(is.na(.x),1,0),
    .names=“{col}\uu Blank”)
    
    structure(list(CustID = c("C-1", "C-2", 
    "C-2", "C-2", "C-3", "C-3", 
    "C-3", "C-4", "C-5"), DATE = c("2021-01-02 14:13:10", "2021-01-02 13:17:07", "2021-01-02 14:15:10", "2021-01-02 16:14:08", "2021-01-02 17:11:03", "2021-01-02 12:14:24", "2021-01-02 12:33:34", "2021-01-02 10:43:55", "2021-01-03 20:23:35"), TYPE = c("Demo", 
    "Pro", "Pro", "Pro", "Pro", "Pro", "Pro", "Pro", "Pro"
    ), LogCat = c(NA, "SPR,DET,RTD", "SPR,DET,RTD", "SPR,DET,RTD", 
    "DET", "DET", "DET", NA, " SPR, RTD "), PriceCode = c(NA,"KR", "SR", "DE", "KL", "ZT", "KR", "KR", "KR")), class = "data.frame", row.names = c(NA, 
    -9L))
    
    Total         4        100.00%
    Demo          1        25.00%
    Pro           3        75.00%
    
    LogCat            Count        %          PriceCode       Count        %
    SPR               0            0.00%      KR              1            50.00%
    SPR (All)         1            50.00%     KR (All)        3            100.00%
    DET               1            50.00%     SR              0            0.00%
    DET (All)         2            100.00%    SR (All)        1            33.33%
    RTD               0            0.00%      DE              0            0.00%
    RTD (All)         1            50.00%     DE (All)        1            33.33%
    Blank             1            33.33%     ZT              0            0.00%
    -                 -            -          ZT (All)        1            33.33%
    -                 -            -          KL              0            0.00%
    -                 -            -          KL (All)        1            33.33%
    -                 -            -          Blank           0            0.00%
    Both Blank        0            0.00%      -               0            0.00%
    
    library(tidyverse)
    library(janitor)
    df %>% mutate(DATE = as.Date(DATE)) %>% select(1:3) %>%
      unique() %>%
      tabyl(TYPE, DATE) %>%
      adorn_totals("row") %>%
      adorn_percentages("col") %>%
      adorn_pct_formatting(2) %>%
      adorn_ns("front")
    
      TYPE  2021-01-02  2021-01-03
      Demo 1  (25.00%) 0   (0.00%)
       Pro 3  (75.00%) 1 (100.00%)
     Total 4 (100.00%) 1 (100.00%)