如何删除DataFrame中相邻列的连续重复数据(允许行内重复)
处理DataFrame中相邻列的连续重复值
需求概述
针对R语言的DataFrame,需实现以下规则:
- 仅处理同一行内相邻列的连续重复值,支持两种处理方式:
- 将连续重复的第二个及后续值替换为
NA(保留原列结构) - 移除连续重复的列,将后续列左移后末尾补
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
相关产品推荐
相关产品推荐

