R语言使用条件语句与循环按ID分组计算breakeven值
R 按分组计算breakeven实现方案
不需要写嵌套循环,直接用dplyr分组统计就能实现,逻辑清晰运行效率也高,完整代码如下:
library(dplyr) output <- data %>% group_by(id) %>% summarise( breakeven = { # 优先判断第16行correlation的规则 if (n() >= 16 && correlation[16] > 0.999) { 16 } else { # 定位growth_factor第一个小于0.8的位置 first_below <- which(growth_factor < 0.8)[1] # 无小于0.8的值时取分组最后一位,否则取首次小于0.8的前一位 ifelse(is.na(first_below), n(), first_below - 1) } }, .groups = "drop" )
逻辑匹配说明
- 完全符合提出的计算规则:先校验每个id分组第16行的
correlation值,满足>0.999直接返回breakeven=16 - 不满足第一个规则时,自动匹配
growth_factor的计算逻辑:比如示例序列c(0.9, 0.88, 0.7, 0.9),第一个小于0.8的值在第3位,减1得到2,和示例结果完全一致 - 做了通用边界兼容:如果某个id分组下
growth_factor全程没有小于0.8的值,会自动取该分组最后一行的序号作为结果,不会返回空值;如果业务场景里存在第一行就小于0.8的特殊情况,可以在else分支里再加一层判断自定义返回值即可
输出格式
最终返回的结果只有id、breakeven两列,行数等于数据集中唯一id的总数,和期望输出格式完全匹配:
# A tibble: 6 × 2 id breakeven <dbl> <dbl> 1 4 2 2 5 4 3 6 2 4 7 4 5 8 2 6 9 16
内容的提问来源于stack exchange,提问作者Solicia
相关产品推荐
相关产品推荐

