基于Base R识别字符串修改内容与位置并生成DataFrame新列
Base R实现文本差异识别(生成new_系列列)
给定仅包含current_text和previous_text两列的数据框,我们需要对比每行的前后文本,识别出修改的内容(new_text)及位置(new_text_position),以下是Base R的实现方案:
1. 初始数据准备
首先构造仅含目标输入列的数据框:
df <- data.frame( current_text = c('thank','thanks','thank','thdank'), previous_text = c(NA, 'thank','thanks','thank'), stringsAsFactors = FALSE )
2. 定义文本对比函数
编写自定义函数处理三种核心修改场景:新增单个字符、删除单个字符、替换单个字符:
compare_text <- function(current, previous) { if (is.na(previous)) { return(list(new_text = NA_character_, new_text_position = NA_integer_)) } curr_chars <- strsplit(current, "")[[1]] prev_chars <- strsplit(previous, "")[[1]] curr_len <- length(curr_chars) prev_len <- length(prev_chars) # 处理新增单个字符的情况 if (curr_len == prev_len + 1) { for (i in seq_len(curr_len)) { if (identical(curr_chars[-i], prev_chars)) { return(list(new_text = curr_chars[i], new_text_position = i)) } } } # 处理删除单个字符的情况 else if (curr_len == prev_len - 1) { for (i in seq_len(prev_len)) { if (identical(prev_chars[-i], curr_chars)) { return(list(new_text = "[DELETE]", new_text_position = NA_integer_)) } } } # 处理单个字符替换的情况 else if (curr_len == prev_len) { diff_pos <- which(curr_chars != prev_chars) if (length(diff_pos) == 1) { return(list(new_text = curr_chars[diff_pos], new_text_position = diff_pos)) } } # 多字符修改等复杂场景返回NA return(list(new_text = NA_character_, new_text_position = NA_integer_)) }
3. 应用函数生成结果列
使用mapply批量处理每行数据,提取结果并添加到数据框:
diff_results <- mapply(compare_text, df$current_text, df$previous_text, SIMPLIFY = FALSE) df$new_text <- sapply(diff_results, function(x) x$new_text) df$new_text_position <- sapply(diff_results, function(x) x$new_text_position)
最终结果
运行代码后,数据框将生成目标列,与示例完全一致:
current_text previous_text new_text new_text_position 1 thank <NA> <NA> NA 2 thanks thank s 6 3 thank thanks [DELETE] NA 4 thdank thank d 3
内容的提问来源于stack exchange,提问作者Adam_G
相关产品推荐
相关产品推荐

