如何在R中按类别数量灵活过滤商品篮数据集?
问题描述
我有如下数据框:
structure(list(CATEGORY = c("Edible, Vape", "Concentrate, Flower", "Concentrate, Flower", "Concentrate, Flower", "Edible", "Concentrate, Flower", "Edible, Vape", "Edible", "Concentrate, Flower", "Concentrate, Flower", "Edible", "Edible", "Edible", "Concentrate, Flower", "Edible", "Edible", "Edible", "Edible, Vape", "Edible", "Edible", "Concentrate, Flower", "Edible", "Concentrate, Flower", "Concentrate, Flower", "Concentrate, Flower", "Edible", "Concentrate, Flower", "Concentrate, Edible, Flower", "Concentrate, Flower", "Edible", "Concentrate, Edible, Flower", "Edible", "Concentrate, Edible, Flower", "Concentrate, Edible, Flower, Vape", "Concentrate, Edible, Flower", "Concentrate, Flower", "Edible", "Edible", "Edible", "Concentrate, Edible, Flower, Vape", "Concentrate, Flower", "Concentrate, Flower", "Edible", "Concentrate, Flower", "Concentrate, Flower", "Concentrate, Flower", "Concentrate, Flower", "Concentrate, Flower", "Concentrate, Flower", "Edible, Vape", "Concentrate, Flower", "Edible, Vape", "Concentrate, Edible, Flower", "Edible, Vape", "Concentrate, Flower", "Edible", "Concentrate, Flower", "Concentrate, Flower", "Edible", "Concentrate, Flower", "Edible, Vape", "Edible", "Concentrate, Edible, Flower, Vape", "Edible", "Edible", "Concentrate, Flower", "Concentrate, Flower", "Edible, Vape", "Concentrate, Flower", "Edible", "Edible", "Edible, Vape", "Edible", "Edible", "Edible", "Concentrate, Flower", "Edible", "Edible", "Concentrate, Flower", "Edible, Vape", "Concentrate, Flower", "Edible", "Edible", "Edible", "Edible", "Concentrate, Flower", "Edible, Vape", "Edible", "Concentrate, Flower", "Edible, Vape", "Concentrate, Flower", "Concentrate, Flower", "Concentrate, Flower", "Concentrate, Flower", "Edible", "Edible", "Edible", "Edible, Vape", "Concentrate, Flower", "Edible")), row.names = c(NA, -100L), class = c("tbl_df", "tbl", "data.frame"))
CATEGORY列的值为逗号分隔的类别组合,存在1个、2个、3个甚至更多类别的情况。执行unique(interesting_baskets_df$CATEGORY)后得到的唯一类别值如下:
[1] "Edible, Vape" "Concentrate, Flower" "Edible" "Concentrate, Edible, Flower" [5] "Concentrate, Edible, Flower, Vape"
我希望仅保留包含1个或2个类别的记录(如"Edible"、"Edible, Vape"、"Concentrate, Flower"),但不想用dplyr::filter硬编码指定类别值,需要一个灵活方案,能根据需求选择保留含N个类别的记录,适配关联规则学习的不同分析场景。
解决方案
核心思路
通过统计CATEGORY值中逗号的数量判断类别数:
- 1个类别:逗号数量为0
- 2个类别:逗号数量为1
- N个类别:逗号数量为
N-1
只需筛选出逗号数量 ≤ 目标类别数-1的记录即可。
方法1:Tidyverse 实现
结合dplyr和stringr实现灵活筛选,示例为保留1-2个类别的记录:
library(dplyr) library(stringr) # 定义要保留的最大类别数 max_categories <- 2 filtered_df <- interesting_baskets_df %>% filter(str_count(CATEGORY, ",") <= max_categories - 1)
若需保留3个及以下类别的记录,仅需修改max_categories的值为3。
方法2:基础R 实现
无需加载额外包,用gregexpr统计逗号数量:
max_categories <- 2 # 统计每个CATEGORY的逗号数量 comma_counts <- sapply(gregexpr(",", interesting_baskets_df$CATEGORY), function(x) sum(x != -1)) # 筛选记录 filtered_df <- interesting_baskets_df[comma_counts <= max_categories - 1, ]
通用函数封装
将逻辑封装为函数,方便重复调用:
filter_by_category_count <- function(df, col_name, max_count) { # 统计逗号数量 comma_counts <- sapply(gregexpr(",", df[[col_name]]), function(x) sum(x != -1)) # 返回筛选后的数据集 return(df[comma_counts <= max_count - 1, ]) } # 示例:保留1-2个类别的记录 filtered_df <- filter_by_category_count(interesting_baskets_df, "CATEGORY", 2) # 示例:保留1-3个类别的记录 filtered_df_3 <- filter_by_category_count(interesting_baskets_df, "CATEGORY", 3)
内容的提问来源于stack exchange,提问作者hachiko
相关产品推荐
相关产品推荐

