如何将数据框每行与参考行对比并按规则分配结果列?
无循环实现数据框行分组方案
针对你提出的行分组需求,我们可以通过向量化操作或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")))
方案说明
- 先提取参考行(第一行)的特征值,作为A类判断的基准;
- 对每行筛选出非"--"的元素,依次判断:
- 无任何非"--"元素 → 赋值"D"
- 非"--"元素全为"HH" → 赋值"B"
- 非"--"元素都属于参考行的值 → 赋值"A"
- 其余情况 → 赋值"C"
- 两种方案均无显式循环,
apply/rowwise属于R内置的隐式向量化操作,效率优于手动循环。
运行上述代码后,生成的结果会与你给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者user3354212
相关产品推荐
相关产品推荐

