如何合并DataFrame两列中对应POT标识的行文本?
R数据框列合并:匹配POT标识合并对应内容
数据
structure(list(cleaned_terms = c(" POT A body POT B Antrum incisura body", " POT A Stomach Oesophagus ", " POT A Antrum c POT B incisura c POT C body ", " POT A POT B cardia cardia cardia POT E POT POT G", " POT A Antrum Antrum POT B"), microscopic_descriptionClean2 = c("POT A: POT B:", "POT A:", "POT A: POT B and POT C IM", "POT A: IM", "POT A: IM" )), row.names = c(NA, -5L), class = "data.frame")
需求
将数据框中的cleaned_terms和microscopic_descriptionClean2两列按POT标识(如POT A、POT B)匹配合并,同一标识的两行内容对应拼接,生成新列。
期望输出
POT A: body POT A: POT B: Antrum incisura body POT B: ---------------------- POT A: Stomach Oesophagus POT A: ------------------------ POT A: Antrum c POT A: POT B: incisura c POT B: POT B and POT C IM POT C: body POT C: POT B and POT C IM ----------------------- POT A: POT A: IM POT B: cardia cardia cardia POT B: POT E: POT E: POT : POT : POT G: POT G: ---------------------- POT A: Antrum Antrum POT A: IM POT B: POT B: ----------------------
当前尝试的问题
你提供的函数仅处理了cleaned_terms的内容,未正确解析microscopic_descriptionClean2中的POT标识与对应文本的映射,导致无法完成匹配合并。
解决方案
以下函数可以实现需求,核心是分别解析两列的POT条目,建立标识到内容的映射后再合并:
merge_pot_entries <- function(cleaned_terms, microscopic_desc) { # 处理cleaned_terms:拆分每行,提取POT标识和内容 cleaned_lines <- strsplit(trimws(cleaned_terms), "\n")[[1]] cleaned_lines <- trimws(cleaned_lines) cleaned_list <- lapply(cleaned_lines, function(line) { if (nchar(line) == 0) return(NULL) # 按POT标识分割,保留标识部分 split_pos <- regexpr("(?<=POT [A-Z]|POT )", line, perl = TRUE) pot_id <- substr(line, 1, split_pos - 1) content <- trimws(substr(line, split_pos, nchar(line))) list(id = pot_id, content = content) }) cleaned_list <- Filter(Negate(is.null), cleaned_list) cleaned_df <- do.call(rbind, lapply(cleaned_list, function(x) data.frame(id = x$id, content = x$content, stringsAsFactors = FALSE))) # 处理microscopic_descriptionClean2:拆分每行,提取POT标识和内容 desc_lines <- strsplit(trimws(microscopic_desc), "\n")[[1]] desc_lines <- trimws(desc_lines) desc_list <- lapply(desc_lines, function(line) { if (nchar(line) == 0) return(NULL) parts <- strsplit(line, ":", fixed = TRUE)[[1]] pot_id <- trimws(parts[1]) content <- ifelse(length(parts) > 1, trimws(paste(parts[-1], collapse = ":")), "") list(id = pot_id, content = content) }) desc_list <- Filter(Negate(is.null), desc_list) desc_df <- do.call(rbind, lapply(desc_list, function(x) data.frame(id = x$id, content = x$content, stringsAsFactors = FALSE))) # 全连接合并两个数据框,保留所有POT条目 merged_df <- merge(cleaned_df, desc_df, by = "id", all = TRUE) merged_df[is.na(merged_df)] <- "" # 按期望格式拼接每行内容,清理多余空格 merged_lines <- apply(merged_df, 1, function(row) { trimmed <- gsub("\\s+", " ", paste0(row["id"], ": ", row["content.x"], " ", row["id"], ": ", row["content.y"])) trimws(trimmed) }) paste(merged_lines, collapse = "\n") } # 应用函数生成新列 potmergednew$merged_text <- mapply(merge_pot_entries, potmergednew$cleaned_terms, potmergednew$microscopic_descriptionClean2, SIMPLIFY = FALSE)
函数说明
- 解析cleaned_terms:按行拆分后,通过正则分割提取每个POT标识和对应的文本内容,过滤空行
- 解析microscopic_descriptionClean2:按行拆分后,按冒号分割提取POT标识和描述内容
- 合并数据:使用全连接合并两个解析后的数据集,确保所有POT条目都被保留,空值替换为空字符串
- 拼接内容:按期望格式拼接每个POT的两部分内容,清理多余空格后组合成最终字符串
内容的提问来源于stack exchange,提问作者Sebastian Zeki
相关产品推荐
相关产品推荐

