编写R代码:按name-month分组筛选小于指定值的最后销售对应产品
解决方案
可以使用dplyr包的分组操作来实现需求,步骤如下:
代码实现
# 若未安装dplyr,先执行安装命令 # install.packages("dplyr") library(dplyr) # 原始数据 val = 14 name = c("Tim", "Tim", "Tim", "Tim", "Tim", "Tim", "Carl", "Carl", "Carl", "Carl" , "Carl" , "Carl") month = c(1,1,1,2,2,2,1,1,1,2,2,2) product = c("a", "b", "c", "a", "b", "c", "a", "b", "c", "a", "b", "c") sales = c(10, 11, 14, 10, 15, 18, 11, 22, 33, 7, 14, 15) df = data.frame(name, month, product, sales) # 核心处理逻辑 result_df <- df %>% group_by(name, month) %>% # 按name和month的组合分组 filter(sales < val) %>% # 筛选每组中sales小于val的行 slice_tail(n = 1) %>% # 取筛选后的最后一行 select(name, month, product) %>% # 保留需要的列 ungroup() # 取消分组,转为普通数据框 # 输出结果 print(result_df)
代码说明
group_by(name, month):将数据按name和month的唯一组合分组,确保每组对应一个需求中的组合。filter(sales < val):仅保留每组中sales值小于val的行。slice_tail(n = 1):提取每组筛选后的最后一行,即符合条件的最后一条记录。select(name, month, product):只保留结果所需的三列。
补充说明
若需求是最后一个小于等于val的行(即包含等于val的情况),只需将filter(sales < val)修改为filter(sales <= val),此时运行结果会匹配你示例中提到的Tim-1对应product=c的情况。
内容的提问来源于stack exchange,提问作者mikeman123
相关产品推荐
相关产品推荐

