如何提取DataFrame中shoe_brand与color分组的前两条交易记录
解决方案
方法1:使用dplyr包(tidyverse生态,代码简洁易读)
适用于已经习惯tidyverse语法的场景,可灵活控制排序逻辑,确保取到的是你需要的「前两条」(比如按交易时间最早排序):
library(dplyr) result <- transactions %>% # 按品牌、颜色分组 group_by(shoe_brand, color) %>% # 按交易时间升序排序,.by_group = TRUE 保证排序在分组内生效 arrange(transaction_date, .by_group = TRUE) %>% # 取每个分组的前2条记录 slice_head(n = 2) %>% # 解除分组,避免后续操作受分组逻辑影响 ungroup()
如果你不需要调整排序,直接按原表的顺序取前2条,去掉arrange行即可。
方法2:Base R原生实现
无需安装任何第三方包,直接用R基础函数实现:
# 先按品牌、颜色、交易时间排序(如果需要按时间取最早的前2条,不需要排序可以跳过这一步) trans_sorted <- transactions[order(transactions$shoe_brand, transactions$color, transactions$transaction_date), ] # 为每个品牌+颜色分组生成组内行号 trans_sorted$group_row <- ave(rep(1, nrow(trans_sorted)), trans_sorted$shoe_brand, trans_sorted$color, FUN = seq_along) # 筛选组内行号小于等于2的记录,删除临时行号列 result <- trans_sorted[trans_sorted$group_row <= 2, ] result$group_row <- NULL
原方案问题说明
之前使用match和unique只能提取到第一条记录,是因为这两个函数的默认逻辑仅返回每个分组的第一个匹配位置,无法批量生成每个分组内的连续行号做范围筛选,因此无法实现取前N条的需求。
内容的提问来源于stack exchange,提问作者Nick Ng
相关产品推荐
相关产品推荐

