基于规则为数据框行高效分配编码的实现方案
优雅实现基于规则的数据框行编码分配
可以通过向量化的条件判断实现需求,避免冗长的嵌套if语句或低效的rowwise()操作,尤其适合大规模数据(如你提到的625行场景)。以下是具体实现:
library(dplyr) library(stringr) library(tidyr) # 生成示例数据 df <- crossing(yr2018=c("M","S","W"), yr2019=c("M","S","W"), yr2020=c("M","S","W")) # 按规则生成编码列 df <- df %>% mutate( code = case_when( # 规则1:三列值完全相同 yr2018 == yr2019 & yr2019 == yr2020 ~ str_c("CON", yr2018), # 规则5:前两列相同、第三列不同 yr2018 == yr2019 & yr2018 != yr2020 ~ str_c("CON", yr2018), # 规则4:后两列相同、第一列不同 yr2019 == yr2020 & yr2019 != yr2018 ~ str_c("CON", yr2019), # 规则2:第一和第三列相同、第二列不同,按固定顺序拼接唯一值 yr2018 == yr2020 & yr2018 != yr2019 ~ pmap_chr( list(yr2018, yr2019), ~str_c(sort(factor(c(..1, ..2), levels = c("M", "S", "W"))), collapse = "") ), # 规则3:三列值均不同 TRUE ~ "MSW" ) ) # 查看结果 print(df, n=27)
实现思路说明
- 向量化优先:使用
dplyr::case_when()进行向量化条件判断,相比逐行处理(如rowwise())效率提升显著,尤其适合大规模数据。 - 规则分层处理:按照规则优先级依次判断(完全相同的情况优先级最高,避免被其他条件覆盖),逻辑清晰易维护。
- 固定顺序拼接:针对第一、三列相同的场景,通过
factor()指定M→S→W的固定顺序,再排序拼接,确保结果不受原始值顺序影响。 - 扩展性强:如果后续扩展到更多列(如你提到的4×5规模),可以通过
across()批量处理年份列,结合table()统计每行值的频次,灵活调整规则逻辑。
内容的提问来源于stack exchange,提问作者E Maas
相关产品推荐
相关产品推荐

