如何用循环/函数简化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
相关产品推荐
相关产品推荐

