在dplyr中使用mutate和slice_max提取TOP缺陷遇问题
如何用dplyr的mutate结合slice_max获取前N排名的缺陷信息
首先给出原始数据框:
df=data.frame(defect= c("defect1","defect2","defect3","defect4","defect5","defect6","defect7", "defect8","defect9","defect10","defect11","defect12","defect13"), num=c(1,2,5,10,20,25,35,45,60,70,3,4,5))
你的需求是获取num字段排名前5和前10的缺陷信息,尝试的代码无法运行,错误代码如下:
df%>% summarise(Defect_list_top_5=paste0(slice_max(num,n=5)," ",num, collapse="|"), Defect_list_top_10=paste0(slice_max(num,n=5)," ",num, collapse="|"))
问题原因
slice_max是用于筛选行的dplyr动词,不能直接在paste0中作为参数嵌套使用,且原代码未指定slice_max操作的数据对象,属于语法错误。
正确实现方式
方式一:在summarise中嵌套slice_max流程
可以在summarise的每个字段里,直接嵌套对原数据框执行slice_max、拼接文本、再合并的流程,无需分步赋值:
df %>% summarise( Defect_list_top_5 = df %>% slice_max(num, n = 5) %>% mutate(combined = paste0(defect, " ", num)) %>% pull(combined) %>% paste(collapse = "|"), Defect_list_top_10 = df %>% slice_max(num, n = 10) %>% mutate(combined = paste0(defect, " ", num)) %>% pull(combined) %>% paste(collapse = "|") )
方式二:先通过mutate生成排名,再汇总
先利用mutate给每行数据添加排名标记,再根据排名筛选并拼接结果:
df %>% mutate(rank = dense_rank(desc(num))) %>% summarise( Defect_list_top_5 = paste0(defect[rank <= 5], " ", num[rank <= 5], collapse = "|"), Defect_list_top_10 = paste0(defect[rank <= 10], " ", num[rank <= 10], collapse = "|") )
两种方式都能得到和分步处理一致的结果,最终输出会是包含两个字段的单行数据框,分别存储前5和前10的缺陷信息。
内容的提问来源于stack exchange,提问作者Ashti
相关产品推荐
相关产品推荐

