如何从R中的多个ID获取独占计数和总计数
我在下面提到了R中的数据帧如何从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
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对于第一部分库
门卫
将很有帮助(即使对于第二部分)
第一部分
我在回答中添加了一些评论和解释。我认为这种方法应该有效,但有几点我不清楚:
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%)