技术问询:如何从大型非规整数据集按年提取毛衣可用颜色
按年份提取毛衣可用颜色的简洁方案
核心逻辑
你的数据结构是颜色条目对应最近提及的服饰,只需先给每个颜色匹配所属的服饰,再筛选毛衣对应的颜色,最后按年份去重汇总即可,无需手动固定提取条目数量。
代码实现(基于你的模拟数据)
set.seed(1) col_1 <- c(rep(c(1888:1891), each = 50), rep(c(1892:1895), each = 30)) a <- c('shirt', 'blue', 'red', 'green', 'pants', 'blue', 'red', 'green', 'yellow', 'sweater', 'black', 'orange', 'purple') b <- rep(a, 30) col_2 <- b[c(1:320)] df <- data.frame(col_1, col_2) # 1. 定义所有服饰的列表(真实数据中根据实际服饰名称调整) clothes_list <- c('shirt', 'pants', 'sweater') # 2. 给每个条目标记所属的服饰组:每次出现新服饰则开启新组,组名为该服饰 df$cloth_group <- with(df, ave(col_2, cumsum(col_2 %in% clothes_list), FUN = function(x) x[1])) # 3. 筛选出属于毛衣的颜色条目(排除毛衣本身的行) sweater_color_data <- df[df$cloth_group == 'sweater' & !df$col_2 %in% clothes_list, ] # 4. 按年份聚合,得到每年不重复的毛衣颜色 yearly_sweater_colors <- aggregate(col_2 ~ col_1, data = sweater_color_data, FUN = function(x) unique(sort(x))) # 查看结果 print(yearly_sweater_colors)
适配真实数据集的调整
- 月度转年度:如果真实数据是月度日期(如
yyyy-mm格式),先提取年份:
之后将聚合的df$year <- format(as.Date(df$month_column, "%Y-%m"), "%Y")col_1替换为year即可。 - 服饰种类更多:只需更新
clothes_list,把所有服饰名称加入,分组逻辑不受影响。 - 颜色随机增减:
unique()会自动去重,确保每年只保留出现过的颜色,不管月度变动。
优势
无需手动估算提取条目数量,完全基于数据本身的服饰-颜色关联逻辑自动匹配,即使每年毛衣多次出现,也能一次性汇总所有对应颜色,大幅减少整理工作量。
内容的提问来源于stack exchange,提问作者Ben Smith
相关产品推荐
相关产品推荐

