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

如何合并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)

函数说明

  1. 解析cleaned_terms:按行拆分后,通过正则分割提取每个POT标识和对应的文本内容,过滤空行
  2. 解析microscopic_descriptionClean2:按行拆分后,按冒号分割提取POT标识和描述内容
  3. 合并数据:使用全连接合并两个解析后的数据集,确保所有POT条目都被保留,空值替换为空字符串
  4. 拼接内容:按期望格式拼接每个POT的两部分内容,清理多余空格后组合成最终字符串

内容的提问来源于stack exchange,提问作者Sebastian Zeki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:10:58