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

两列自定义模式匹配与替换:保持列内分组一致性

问题解决:统一seq2列的分组取值

原始数据集

dat <- read.table(text = "
   var seq1 seq2
1   A1    1    4
2   AL    1    4
3    E    1    2
4    F    1    4
5   A3    2    3
6   A6    2    3
7   Si    2    3
8   A5    3    2
9   IN    3    2
10  Z5    3    2  
", header = TRUE)

需求

  • 当变量在seq1和seq2中的分组模式高度一致时,将seq2的取值统一为对应seq1的值(如A5、IN、Z5的seq1均为3,seq2均为2,属于同组模式,因此seq2统一改为3)
  • 确保seq2内部分组唯一,例如E的seq2从2改为3(避免seq2=2同时对应seq1=1和seq1=3两个分组)

尝试的错误代码

dat <- dat %>%
rowwise%>%
  mutate('seq2' = ifelse(dat$seq==dat$seq2,dat$seq,dat$seq2))

错误点:

  • 列名引用错误(dat$seq应为seq1)
  • rowwise上下文无需使用dat$直接引用列
  • 逻辑仅判断单行列值是否相等,未处理分组模式的匹配逻辑

解决方案

核心思路是先建立seq2到seq1的映射关系(基于分组出现频次),再替换seq2的值:

步骤1:构建映射表

统计每个seq2值对应的最频繁出现的seq1分组,作为seq2的目标取值:

library(dplyr)

# 构建seq2到目标seq1的映射
mapping <- dat %>%
  count(seq1, seq2) %>%  # 统计每个seq1-seq2组合的出现次数
  group_by(seq2) %>%
  slice_max(n, n = 1) %>%  # 对每个seq2,选择出现次数最多的seq1
  ungroup() %>%
  select(seq2, new_seq2 = seq1)  # 重命名为映射目标列

步骤2:替换seq2值

将原始数据与映射表关联,替换seq2:

dat2 <- dat %>%
  left_join(mapping, by = "seq2") %>%
  mutate(seq2 = new_seq2) %>%
  select(-new_seq2)  # 移除临时列

最终结果

运行后得到的dat2与期望输出完全一致:

> dat2
   var seq1 seq2
1   A1    1    1
2   AL    1    1
3    E    1    3
4    F    1    1
5   A3    2    2
6   A6    2    2
7   Si    2    2
8   A5    3    3
9   IN    3    3
10  Z5    3    3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:10:17