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

如何在R的Arrow数据集中去除重复行?已遇函数调用报错

Arrow数据集去重:替代distinct与duplicated的方案

问题背景

使用Arrow数据集优化内存占用时,遇到去重需求:

  • 原dplyr的distinct(.keep_all = TRUE)在Arrow中不支持,运行代码报错:
Sales_2021 <- Sales_2021 %>%
  group_by(`Cust-Item-Loc`) %>%
  arrange(desc(SBINDT)) %>% 
  distinct(`Cust-Item-Loc`, .keep_all = TRUE) %>%
  collect()

错误提示:

Error: distinct() with .keep_all = TRUE not supported in Arrow

  • 尝试filter(!duplicated())也无法在Arrow Dataset上运行,代码:
Sales_2021 <- Sales_2021 %>%
  group_by(`Cust-Item-Loc`) %>%
  arrange(desc(SBINDT)) %>% 
  filter(!duplicated(`Cust-Item-Loc`)) %>%
  collect()

错误提示:

Error: Filter expression not supported for Arrow Datasets: !duplicated(Cust-Item-Loc)
Call collect() first to pull data into R.

解决方案:用slice系列函数实现分组去重

Arrow支持slice_head()/slice_tail()函数,结合排序和分组可以完美实现保留每组指定行的需求,代码如下:

Sales_2021 <- Sales_2021 %>%
  arrange(desc(SBINDT)) %>%  # 全局按SBINDT降序,确保最新记录排在每组首位
  group_by(`Cust-Item-Loc`) %>%
  slice_head(n = 1) %>%  # 选取每组第一行(即最新记录)
  ungroup() %>%  # 按需取消分组,不影响后续操作可省略
  collect()

关键说明

  • slice_head(n = 1)会在每个分组内选取排序后的首行,完全匹配你保留每组最新(SBINDT最大)记录的需求
  • 优先全局排序再分组,比分组内排序更高效;如果需要分组内单独排序,也可以把arrange放到group_by之后
  • 若需保留每组最旧记录,可改为arrange(SBINDT)后用slice_head(n = 1),或直接用slice_tail(n = 1)

简化场景:仅保留唯一标识列

如果不需要保留其他列,仅需获取Cust-Item-Loc的唯一值,可直接使用不带.keep_all的distinct():

Sales_2021 <- Sales_2021 %>%
  distinct(`Cust-Item-Loc`) %>%
  collect()

内容的提问来源于stack exchange,提问作者grislepak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 06:40:27