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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:24:24