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

如何用循环/函数简化R中case_when生成周变量的代码?

优化周变量生成的几种方法

方法一:最简洁的数学计算法

完全不用写重复的case_when,直接用向上取整函数就能搞定——把天数除以7后向上取整,刚好对应你要的周数:

mydf %>%
  mutate(week = ceiling(lfday / 7))

比如lfday=7时,7/7=1,向上取整后是1;lfday=8时,8/7≈1.14,向上取整后是2,完美匹配你的分组规则。

方法二:按你的思路自动生成case_when条件

如果一定要保留case_when的形式,可以用字符串拼接自动生成所有条件,不用手动复制粘贴:

library(purrr)
library(dplyr)
library(rlang)

# 定义索引和对应的周数
indices <- 0:9
week_nums <- 1:10

# 批量生成每个case_when条件字符串
case_conditions <- map2_chr(indices, week_nums, function(i, w) {
  paste0("lfday >= 1+", i, "*7 & lfday <=7+", i, "*7 ~ '", w, "'")
})

# 把字符串转为可执行的R表达式,传入case_when
mydf %>%
  mutate(week = as.numeric(case_when(!!!parse_exprs(paste(case_conditions, collapse = ",")))))

这里用map2_chr遍历两个向量生成所有条件,再通过parse_exprs把字符串转成R可识别的表达式,!!!用来把表达式展开传给case_when。

方法三:用cut函数直接分组

还可以用分组函数cut直接按7天区间切割天数,再把分组标签转成数字:

mydf %>%
  mutate(week = as.numeric(cut(lfday, breaks = seq(0, 70, by=7), labels = 1:10)))

breaks参数设置分组的边界(0、7、14……70),labels对应每个区间的周数,最后转成数字即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:55:12