如何提取R数据框字符串列中相同位置的重复字符?
在R中提取数据框列内字符串相同位置的重复字符
给定如下R数据框,需要提取每列所有字符串在相同位置上完全一致的字符,拼接成结果字符串,最终得到与示例中result一致的输出:
df <- data.frame(col1 = paste0("a", LETTERS[1:5]), col2 = paste0("b", letters[1:5]), col3 = paste0("ccde", letters[1:5]), col4 = paste0('?', letters[1:2], 1:5), col5 = paste0(1:5, 'hello you', letters[1:2], 1:5), col6 = paste0('hello', letters[1:2], 1:5, "you"), col7 = c("hello1 you", "hello you2", "hello3 you", "hello you4", "hello5 you"))
实现方案
核心思路是将每列的字符串拆分为单个字符,逐位置检查所有行的字符是否一致,保留一致的字符并拼接:
# 定义处理单列的函数 extract_common_chars <- function(col) { # 将列中每个字符串拆分为字符向量(先转字符避免因子类型问题) char_list <- strsplit(as.character(col), "") # 转换为矩阵:每行对应一个字符串的字符,每列对应所有字符串的同位置字符 char_matrix <- do.call(rbind, char_list) # 标记所有行字符一致的位置 common_pos <- apply(char_matrix, 2, function(x) length(unique(x)) == 1) # 提取并拼接一致位置的字符 paste(char_matrix[1, common_pos], collapse = "") } # 应用函数到数据框所有列 result <- sapply(df, extract_common_chars) result
输出结果
运行上述代码后,得到的结果与需求完全匹配:
col1 col2 col3 col4 col5 col6 col7 "a" "b" "ccde" "?" "hello you" "helloyou" "hello"
代码解释
- 字符串拆分:
strsplit(as.character(col), "")将列中每个字符串拆分为单个字符的列表,同时把列转为字符类型(避免数据框默认的因子类型干扰)。 - 矩阵转换:
do.call(rbind, char_list)把字符列表转为矩阵,方便按位置(列)统一检查所有行的字符。 - 位置检查:
apply(char_matrix, 2, ...)遍历矩阵的每一列(对应原字符串的每个位置),通过length(unique(x)) == 1判断该位置的字符是否在所有行中完全一致。 - 字符拼接:提取第一行中所有一致位置的字符(所有行该位置字符相同,取任意一行均可),用
paste(..., collapse = "")拼接成最终字符串。
内容的提问来源于stack exchange,提问作者Maël
相关产品推荐
相关产品推荐

