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

在R中基于Issue_key层级拼接Issue_description生成目标列

问题解决:根据字符串层级拼接描述字段

我有一个dataframe,需要依据Issue_key列的字符串层级关系,将Issue_description列的字符串拼接成Issue_description_needed列的指定格式。此前尝试使用dplyr包的lag和summarise函数,但该方法不正确。

输入数据

input <- data.frame(
  
  Issue_Key = c("KLM391",
                "KLM391.02",
                "KLM391.01",
                "KLM391.04",
                "KLM391.01.0999993",
                "KLM391.01.0999993.898",
                "KLM391.01.0999993.898.asds",
                "KLM391.01.0999993.898.tyut",
                "KLM391.02.0999993",
                "KLM391.02.0999996",
                "KLM391.04.0999991",
                "KLM391.04.0999998"),
  
  Issue_description = c("L",
                        "M2",
                        "M1",
                        "M4",
                        "O123",
                        "P1234",
                        "Q12345",
                        "Q67809",
                        "XYq12",
                        "46525",
                        "4hrh4",
                        "fg785"),
  
  Issue_description_needed = c(
    "L",
    "L.M2",
    "L.M1",
    "L.M4",
    "L.M1.O123",
    "L.M1.O123.P1234",
    "L.M1.O123.P1234.Q12345",
    "L.M1.O123.P1234.Q67809",
    "L.M2.XYq12",
    "L.M2.46525",
    "L.M4.4hrh4",
    "L.M4.fg785"
  )
)

期望输出

Issue_Key Issue_description    Issue_description_needed
1                      KLM391                 L                           L
2                   KLM391.01                M1                        L.M1
3           KLM391.01.0999993              O123                   L.M1.O123
4       KLM391.01.0999993.898             P1234             L.M1.O123.P1234
5  KLM391.01.0999993.898.asds            Q12345      L.M1.O123.P1234.Q12345
6  KLM391.01.0999993.898.tyut            Q67809      L.M1.O123.P1234.Q67809
7                   KLM391.02                M2                        L.M2
8           KLM391.02.0999993             XYq12                  L.M2.XYq12
9           KLM391.02.0999996             46525                  L.M2.46525
10                  KLM391.04                M4                        L.M4
11          KLM391.04.0999991             4hrh4                  L.M4.4hrh4
12          KLM391.04.0999998             fg785                  L.M4.fg785

解决方案

通过拆分Issue_Key的层级结构,生成每个key的所有前缀路径,再匹配对应的描述字段并拼接,即可得到目标格式。代码如下:

library(dplyr)
library(stringr)
library(purrr)

# 处理数据并生成目标字段
result <- input %>%
  # 将Issue_Key拆分为层级部分
  mutate(key_parts = str_split(Issue_Key, "\\.")) %>%
  # 生成当前key的所有前缀路径
  mutate(prefix_keys = map(key_parts, function(parts) {
    map_chr(seq_along(parts), function(n) {
      paste(parts[1:n], collapse = ".")
    })
  })) %>%
  # 匹配前缀对应的描述并拼接成目标格式
  mutate(Issue_description_needed = map_chr(prefix_keys, function(keys) {
    input$Issue_description[match(keys, input$Issue_Key)] %>%
      paste(collapse = ".")
  })) %>%
  # 按层级长度和key本身排序,和期望输出一致
  arrange(str_length(Issue_Key), Issue_Key) %>%
  # 移除中间辅助列
  select(-key_parts, -prefix_keys)

# 输出结果
print(result, row.names = TRUE)

代码说明

  1. 拆分层级:用str_split把每个Issue_Key按点拆分成多个部分,明确层级结构。
  2. 生成前缀路径:对每个拆分后的层级列表,生成所有可能的前缀组合(从最顶层到当前层级)。
  3. 匹配并拼接:根据前缀路径匹配对应的Issue_description,再用点连接成目标字符串。
  4. 排序:按Issue_Key的长度和本身排序,保证输出顺序和期望一致。

参考思路

参考了Stack Overflow上的两个相关问题:

  • 按ID合并部分重复行,但每列有不同条件
  • 如何将部分匹配字符串的行分组并求和

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 08:17:45