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

基于规则为数据框行高效分配编码的实现方案

优雅实现基于规则的数据框行编码分配

可以通过向量化的条件判断实现需求,避免冗长的嵌套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)

实现思路说明

  1. 向量化优先:使用dplyr::case_when()进行向量化条件判断,相比逐行处理(如rowwise())效率提升显著,尤其适合大规模数据。
  2. 规则分层处理:按照规则优先级依次判断(完全相同的情况优先级最高,避免被其他条件覆盖),逻辑清晰易维护。
  3. 固定顺序拼接:针对第一、三列相同的场景,通过factor()指定M→S→W的固定顺序,再排序拼接,确保结果不受原始值顺序影响。
  4. 扩展性强:如果后续扩展到更多列(如你提到的4×5规模),可以通过across()批量处理年份列,结合table()统计每行值的频次,灵活调整规则逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:35:37