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

如何将数据框每行与参考行对比并按规则分配结果列?

无循环实现数据框行分组方案

针对你提出的行分组需求,我们可以通过向量化操作或apply系列函数实现无循环的解决方案,以下提供两种可行方案:

方案一:使用dplyr包(简洁易读)

library(dplyr)

# 提取参考行的特征列值(排除ID列)
ref_vals <- df[1, -1] %>% unlist()

df_result <- df %>%
  rowwise() %>%
  mutate(
    # 筛选当前行非"--"的所有值
    non_dash = c_across(M1:M4)[c_across(M1:M4) != "--"],
    # 生成四个判断条件
    all_dash = length(non_dash) == 0,
    only_hh = all(non_dash == "HH"),
    only_ref = all(non_dash %in% ref_vals),
    # 按规则赋值result列
    result = case_when(
      all_dash ~ "D",
      only_hh ~ "B",
      only_ref ~ "A",
      TRUE ~ "C"
    )
  ) %>%
  # 移除中间辅助列
  select(-non_dash, -all_dash, -only_hh, -only_ref)

方案二:Base R实现(无需额外依赖)

# 提取参考行的特征列值(排除ID列)
ref_vals <- unlist(df[1, -1])

# 为每行提取非"--"的元素列表
non_dash_list <- apply(df[, -1], 1, function(x) x[x != "--"])

# 生成核心判断条件
all_dash <- sapply(non_dash_list, length) == 0  # 是否全为"--"
only_hh <- sapply(non_dash_list, function(x) all(x == "HH"))  # 是否只有HH(含--)
only_ref <- sapply(non_dash_list, function(x) all(x %in% ref_vals))  # 是否只有参考值(含--)

# 按规则赋值result列
df$result <- ifelse(all_dash, "D",
                    ifelse(only_hh, "B",
                           ifelse(only_ref, "A", "C")))

方案说明

  1. 先提取参考行(第一行)的特征值,作为A类判断的基准;
  2. 对每行筛选出非"--"的元素,依次判断:
    • 无任何非"--"元素 → 赋值"D"
    • 非"--"元素全为"HH" → 赋值"B"
    • 非"--"元素都属于参考行的值 → 赋值"A"
    • 其余情况 → 赋值"C"
  3. 两种方案均无显式循环,apply/rowwise属于R内置的隐式向量化操作,效率优于手动循环。

运行上述代码后,生成的结果会与你给出的预期输出完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:13:31