R语言:基于条件组合列表批量为数据框生成FLC衍生列
批量生成FLC列的R实现方案
核心做法
遍历combinations.list里的每个列组合,对每个组合重复执行FLC列的生成逻辑,最后把结果以FLC.xxx的命名加到原数据框里就行。
具体代码实现
1. 封装单条件的FLC生成函数
先把针对单个条件向量的FLC生成逻辑打包成函数,后续批量调用更省事:
generate_flc <- function(data, cols) { # 按Case分组,只在同一组内做行对比 data %>% group_by(Case) %>% mutate( # 判断当前行和下一行的指定列是否全部一致 same_group = ifelse(row_number() == n(), TRUE, # 每组最后一行没有下一行,直接标记为一致 all(across(all_of(cols), ~ . == lead(.)))), # 结合Outcome生成FLC值(这里的逻辑要替换成你实际的业务规则,仅作示例) flc = case_when( Outcome == "Event" ~ "E", same_group ~ "C", TRUE ~ "N" ) ) %>% pull(flc) }
注意:same_group和flc的生成逻辑需匹配你的实际规则,核心是用lead()实现行与下一行的对比,across(all_of(cols))处理多列组合的批量判断。
2. 循环批量生成FLC列
用循环遍历每个列组合,调用上面的函数生成列后添加到原数据框:
library(dplyr) # 示例列组合列表,替换成你自己的combinations.list combinations.list <- list( c("A"), c("A", "B"), c("B", "C") ) # 批量生成列 for (cols in combinations.list) { # 生成列名:比如列A对应FLC.A,列A+B对应FLC.AB col_name <- paste0("FLC.", paste(cols, collapse = "")) # 生成列并添加到Data中 Data[[col_name]] <- generate_flc(Data, cols) }
3. 用purrr的函数式写法(更简洁)
如果习惯函数式编程风格,也可以用purrr实现:
library(purrr) library(dplyr) # 批量生成所有FLC列的结果列表 flc_cols <- map(combinations.list, ~ generate_flc(Data, .x)) # 给每个结果命名对应的列名 names(flc_cols) <- map_chr(combinations.list, ~ paste0("FLC.", paste(.x, collapse = ""))) # 把生成的列合并到原数据框 Data <- bind_cols(Data, flc_cols)
关键要点
across(all_of(cols)):确保多列组合时,能一次性判断所有指定列的当前行与下一行是否完全一致。group_by(Case):保证行对比只在同一个Case分组内进行,符合你要求的分组规则。- 列名生成逻辑:用
paste(cols, collapse = "")把多列拼接成后缀(如AB、BC),不同条件的FLC列一目了然。
内容的提问来源于stack exchange,提问作者CNiessen
相关产品推荐
相关产品推荐

