You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言diamonds数据集多列筛选 找出满足多条件的钻石颜色

R 代码优化方案

你现有的代码仅能筛选出「切工+颜色组合的克拉中位数大于1」的分组,无法直接匹配你需要的「颜色覆盖全量切工、且该颜色整体克拉中位数大于1.0」的需求,以下是两种常用的优化实现:

方案1:tidyverse 写法(可读性最优,适合数据分析场景)

依赖tidyverse套件(diamonds数据集本身属于ggplot2包,属于tidyverse套件的一部分)

library(tidyverse)

# 预统计全量切工类型总数,用于后续校验覆盖情况
total_cut_types <- n_distinct(diamonds$cut)

qualified_colors <- diamonds %>%
  group_by(color) %>%
  # 同时校验两个筛选条件
  filter(
    n_distinct(cut) == total_cut_types,
    median(carat) > 1.0
  ) %>%
  distinct(color) %>%
  pull(color)

运行后qualified_colors得到的结果就是J,完全匹配你的预期。

方案2:base R 写法(无第三方包依赖)

如果不想加载额外包,可以用原生函数实现:

# 预统计全量切工类型总数
total_cut_types <- length(unique(diamonds$cut))

# 分别校验两个条件
is_full_cut_cover <- tapply(diamonds$cut, diamonds$color, \(x) length(unique(x)) == total_cut_types)
is_median_gt1 <- tapply(diamonds$carat, diamonds$color, median) > 1.0

# 提取同时满足条件的颜色
qualified_colors <- names(which(is_full_cut_cover & is_median_gt1))

优化核心点

  • 逻辑对齐需求:明确按颜色单维度分组校验两个条件,避免原代码双维度聚合导致的逻辑偏差
  • 计算效率更高:仅需要一次分组计算即可拿到结果,不需要多轮聚合拼接
  • 结果直接可用:输出直接为符合要求的颜色值,不需要二次提取转换

如果需要沿用你原来的aggregate写法思路,也可以调整为:

# 校验颜色的切工覆盖情况
cut_cover_df <- aggregate(cut ~ color, diamonds, \(x) length(unique(x)) == length(unique(diamonds$cut)))
# 计算各颜色的克拉中位数
carat_med_df <- aggregate(carat ~ color, diamonds, median)
# 拼接两个表筛选符合条件的颜色
qualified_colors <- merge(cut_cover_df, carat_med_df, by = "color") |>
  subset(cut == TRUE & carat > 1.0, select = color) |>
  unlist() |>
  unname()

内容的提问来源于stack exchange,提问作者Ashley C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 11:39:01