R语言dplyr工具按客户统计负额票据数量问题求助
用dplyr按客户统计TIC_TOTAL_TCC < 0的票据数量
嘿,我来帮你捋捋这个问题~你的代码结果不对主要有两个小问题:一是分组的时候多带了IDTICKET,导致最终结果是按「客户+票据」的组合统计,而不是按客户汇总;二是sum()里的语法写错啦,TIC_TOTALTTC[TIC_TOTALTTC] < 0这种索引方式是错误的。
下面根据你的数据结构给出两种解决方案:
情况1:一行数据对应一张票据(每个IDTICKET只出现一次)
如果你的数据里每个IDTICKET唯一对应一行,那直接按IDCLIENT分组,统计TIC_TOTAL_TCC < 0的行数就行:
library(dplyr) nb_ticket_remb <- df %>% group_by(IDCLIENT) %>% summarise( RemboursementTicket = sum(TIC_TOTAL_TCC < 0, na.rm = TRUE) )
TIC_TOTAL_TCC < 0会生成一个逻辑向量,sum()会把TRUE当作1、FALSE当作0,直接统计符合条件的数量- 加
na.rm = TRUE是为了处理数据中可能存在的NA值,避免结果变成NA
情况2:一张票据对应多行数据(同一个IDTICKET出现多次)
如果同一个IDTICKET有多行记录,你需要先判断这张票据是否至少有一条记录的TIC_TOTAL_TCC < 0,再按客户统计这样的票据数量:
library(dplyr) nb_ticket_remb <- df %>% # 先按客户+票据分组,判断该票据是否有负数 group_by(IDCLIENT, IDTICKET) %>% summarise(has_negative = any(TIC_TOTAL_TCC < 0, na.rm = TRUE), .groups = "drop_last") %>% # 再按客户汇总符合条件的票据数量 summarise(RemboursementTicket = sum(has_negative))
any()用来判断当前票据下是否存在至少一个负数记录.groups = "drop_last"会去掉最内层的IDTICKET分组,只保留IDCLIENT的分组,方便后续汇总
你可以根据自己的实际数据结构选对应的方法~
内容的提问来源于stack exchange,提问作者JackR
相关产品推荐
相关产品推荐

