两列自定义模式匹配与替换:保持列内分组一致性
问题解决:统一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
相关产品推荐
相关产品推荐

