如何在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 = TRUEnot 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
相关产品推荐
相关产品推荐

