在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)
代码说明
- 拆分层级:用
str_split把每个Issue_Key按点拆分成多个部分,明确层级结构。 - 生成前缀路径:对每个拆分后的层级列表,生成所有可能的前缀组合(从最顶层到当前层级)。
- 匹配并拼接:根据前缀路径匹配对应的Issue_description,再用点连接成目标字符串。
- 排序:按Issue_Key的长度和本身排序,保证输出顺序和期望一致。
参考思路
参考了Stack Overflow上的两个相关问题:
- 按ID合并部分重复行,但每列有不同条件
- 如何将部分匹配字符串的行分组并求和
内容的提问来源于stack exchange,提问作者CaseebRamos
相关产品推荐
相关产品推荐

