如何为分组数据应用简单函数生成带状态标识的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
相关产品推荐
相关产品推荐

