R语言:对用户工单统计结果排序、添加占比及求和的技术求助
R语言工单统计需求解决方案
完整代码(基于dplyr+janitor实现所有需求)
library(dplyr) library(janitor) # 一站式完成筛选、统计、排序、百分比计算、添加总计行 data_df_2 <- data %>% filter(q_1 == '4') %>% count(ticket_holder_username, name = "ticket_count") %>% arrange(desc(ticket_count)) %>% mutate(percentage = round(ticket_count / sum(ticket_count) * 100, 2)) %>% adorn_totals("row")
分需求解释
按频次排序
用arrange(desc(ticket_count))实现降序排序,这里的ticket_count是自定义的计数列名(替代默认的n,更直观)。链式操作确保数据始终是标准data.frame,不会出现你之前遇到的is.data.frame(df) is not true错误——之前的问题大概率是count时传入字符串列名的方式不对,直接用裸列名(不带引号)是dplyr的标准用法。新增工单占比列
通过mutate计算百分比:ticket_count / sum(ticket_count) * 100,用round(..., 2)保留2位小数,方便查看。sum(ticket_count)会自动计算当前筛选后总工单的数量。底部显示计数总和
推荐用janitor包的adorn_totals("row"),它会自动在结果底部添加一行Total,并计算计数列的总和,百分比列自动设为100%。如果不想额外装包,也可以手动添加总计行:# 手动添加总计行(无需janitor) total_row <- tibble(ticket_holder_username = "Total", ticket_count = sum(data_df_2$ticket_count), percentage = 100) data_df_2 <- bind_rows(data_df_2, total_row)
关于你之前的错误说明
你用arrange(desc())报错,是因为count(data2, "ticket_holder_username")的写法不符合dplyr的规范——传入字符串列名时需要用.all_of()包裹(比如count(data2, .all_of("ticket_holder_username"))),否则生成的对象可能不是标准data.frame。改用链式操作直接引用裸列名,就能彻底避免这类问题。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

