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

如何为分组数据应用简单函数生成带状态标识的sub_id

实现分组生成sub_id的解决方案

先明确需求:我们要给每个gr分组生成sub_id,规则是如果该分组里id为"bad"对应的count是这个分组的最小值,就标记为red flag,否则标记为green flag。

首先先把你的测试数据定义好:

test <- data.frame(gr=gl(2,4), id =rep(c("Good","bad","ugly","dirty"),2), count=c(175,1,13,11, 10,165,10,2))

方法一:用dplyr(tidyverse工具链)

这是最直观的分组处理方式,代码可读性很高:

library(dplyr)

test_with_subid <- test %>%
  group_by(gr) %>%
  mutate(sub_id = ifelse(count[id == "bad"] == min(count), "red flag", "green flag")) %>%
  ungroup()

# 查看结果
print(test_with_subid)

运行后会得到符合要求的结果:

# A tibble: 8 × 4
  gr    id    count sub_id   
  <fct> <chr> <dbl> <chr>    
1 1     Good    175 red flag 
2 1     bad       1 red flag 
3 1     ugly     13 red flag 
4 1     dirty    11 red flag 
5 2     Good     10 green flag
6 2     bad     165 green flag
7 2     ugly     10 green flag
8 2     dirty     2 green flag

简单解释:group_by(gr)按组拆分数据,count[id == "bad"]取出当前组里id为bad的count值,和组内最小值min(count)做比较,用ifelse生成对应的标记,最后ungroup()取消分组状态,回到常规数据框格式。

方法二:用Base R实现(无需额外包)

如果不想加载第三方包,用原生R的ave函数也能搞定:

test$sub_id <- ave(test$count, test$gr, FUN = function(x) {
  # 定位当前组中id为bad对应的count值
  bad_count <- x[test$id[test$gr == unique(test$gr)] == "bad"]
  if (bad_count == min(x)) {
    "red flag"
  } else {
    "green flag"
  }
})

# 查看结果
print(test)

这个方法里,ave函数会按gr分组对count列应用自定义函数,在函数里我们先找到当前组的bad对应count,再和组内最小值对比,返回对应的标记。

两种方法都能实现需求,看你平时的代码习惯选择就好~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:29:12