You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:07:26