R语言如何实现数据框两列逐行匹配、下移整行并填充NA
R语言实现A/B列逐行匹配错位填充方案
实现逻辑
- 逐行扫描原始数据,对比每行A、B两列的字符值
- 若两列值完全一致,直接保留该行写入结果集
- 若两列值不一致,先插入1行A、B列均为原A列值、C/D列填充NA的空行,再将原行的A列替换为原B列值后写入结果集,保证结果中每行A、B列值完全匹配
- 最后重置结果集行号即可得到目标结构
完整可运行代码
# 1. 构造题目给出的原始测试数据 raw_df <- data.frame( A = c("a", "b", "d", "e"), B = c("a", "c", "d", "f"), C = c(1, 1, 0, 2), D = c(3, 2, 1, 3), stringsAsFactors = FALSE ) # 2. 初始化空结果集 result_df <- data.frame( A = character(), B = character(), C = numeric(), D = numeric(), stringsAsFactors = FALSE ) # 3. 逐行处理原始数据 for (row_idx in seq_len(nrow(raw_df))) { current <- raw_df[row_idx, ] if (current$A == current$B) { # 值匹配直接追加 result_df <- rbind(result_df, current) } else { # 值不匹配先插A值对应的空行 empty_row <- data.frame( A = current$A, B = current$A, C = NA_real_, D = NA_real_, stringsAsFactors = FALSE ) result_df <- rbind(result_df, empty_row) # 再追加修正A列后的原数据行 fixed_row <- data.frame( A = current$B, B = current$B, C = current$C, D = current$D, stringsAsFactors = FALSE ) result_df <- rbind(result_df, fixed_row) } } # 4. 重置行号 rownames(result_df) <- seq_len(nrow(result_df))
结果验证
运行以下命令查看输出:
print(result_df)
控制台输出与题目要求的目标结构完全一致:
A B C D 1 a a 1 3 2 b b NA NA 3 c c 1 2 4 d d 0 1 5 e e NA NA 6 f f 2 3
注:如果数据量较大,可将循环内的
rbind替换为提前预分配内存、按索引赋值的写法提升运行效率,上述代码为了逻辑直观采用了最易读的实现方式。
内容的提问来源于stack exchange,提问作者Carol Li
相关产品推荐
相关产品推荐

