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

如何删除DataFrame中相邻列的连续重复数据(允许行内重复)

处理DataFrame中相邻列的连续重复值

需求概述

针对R语言的DataFrame,需实现以下规则:

  • 仅处理同一行内相邻列的连续重复值,支持两种处理方式:
    1. 将连续重复的第二个及后续值替换为NA(保留原列结构)
    2. 移除连续重复的列,将后续列左移后末尾补NA
  • 同一行内非相邻的重复值(如示例中col2的b和col5的b)无需处理

示例数据与期望结果

基础示例

原始数据:

df1 <- data.frame(
  col1=c("a","a"),
  col2=c("b","b"),
  col3=c("b","b"),
  col4=c("e","e"),
  col5=c("b","b"),
  stringsAsFactors = FALSE
)

输出结果一(替换连续重复为NA):

col1 col2 col3 col4 col5
x1    a    b <NA>    e    b
x2    a    b <NA>    e    b

输出结果二(左移列,末尾补NA):

col1 col2 col3 col4 col5
x1    a    b    e    b <NA>
x2    a    b    e    b <NA>

扩展示例

原始数据:

df_extend <- data.frame(
  col1=c("a","a","a"),
  col2=c("b","b","b"),
  col3=c("b","b","c"),
  col4=c("e","e","d"),
  col5=c("b","b","e"),
  col6=c("d","d","e"),
  stringsAsFactors = FALSE
)
rownames(df_extend) <- c("x1","x2","x3")

期望结果(替换连续重复为NA):

col1 col2 col3 col4 col5 col6
x1    a    b <NA>    e    b    d
x2    a    b <NA>    e    b    d
x3    a    b    c    d    e <NA>

解决方案

方案1:替换连续重复值为NA(保留原列结构)

使用Base R的apply逐行处理,对比相邻列值并标记重复项:

remove_consecutive_col_dups <- function(df) {
  processed_df <- t(apply(df, 1, function(row) {
    for (i in 2:length(row)) {
      if (row[i] == row[i-1]) {
        row[i] <- NA
      }
    }
    row
  }))
  processed_df <- as.data.frame(processed_df, stringsAsFactors = FALSE)
  colnames(processed_df) <- colnames(df)
  rownames(processed_df) <- rownames(df)
  processed_df
}

# 测试基础示例
df_result1 <- remove_consecutive_col_dups(df1)
print(df_result1)

# 测试扩展示例
df_extend_result <- remove_consecutive_col_dups(df_extend)
print(df_extend_result)

方案2:左移列并补NA(压缩连续重复列)

通过筛选非连续重复的元素,再补NA至原列长度:

shift_consecutive_col_dups <- function(df) {
  processed_df <- t(apply(df, 1, function(row) {
    keep_idx <- c(TRUE, row[-1] != row[-length(row)])
    filtered_row <- row[keep_idx]
    c(filtered_row, rep(NA, length(row) - length(filtered_row)))
  }))
  processed_df <- as.data.frame(processed_df, stringsAsFactors = FALSE)
  colnames(processed_df) <- colnames(df)
  rownames(processed_df) <- rownames(df)
  processed_df
}

# 测试基础示例
df_result2 <- shift_consecutive_col_dups(df1)
print(df_result2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:33:26