我有一个数据帧,看起来像这样.我需要使用PROJ_ID列中的字符串创建一个新的值列,并从PROJ_NAME列形成值字符串.

这里提供的解决方案(Accumulate values from one column based on keys of another column in r)需要很长时间才能运行(并且不能在下面显示的情况下产生正确的输出),所以我使用@r2evans推荐.

                   PROJ_ID     PROJ_NAME
1                   KA0034       A JST#3
2                KA0034.10 A JST#3-Dares
3         KA0034.10.110201 A JST#3-Dares
4     KA0034.10.110201.LOV           VOM
5 KA0034.10.110201.LOV.MAX A JST#3-Dares
6                KA0034.FN   Some Invent
7         KA0034.FN.010XYZ   Some Invent
8     KA0034.FN.010XYZ.LEX   Some Invent
9 KA0034.FN.010XYZ.LEX.NAT       A JST#3
input <- data.frame(
  
  PROJ_ID = c("KA0034",
              "KA0034.10",
              "KA0034.10.110201",
              "KA0034.10.110201.LOV",
              "KA0034.10.110201.LOV.MAX",
              "KA0034.FN",
              "KA0034.FN.010XYZ",
              "KA0034.FN.010XYZ.LEX",
              "KA0034.FN.010XYZ.LEX.NAT"),
  
  PROJ_NAME = c("A JST#3",
                "A JST#3-Dares",
                "A JST#3-Dares",
                "VOM",
                "A JST#3-Dares",
                "Some Invent",
                "Some Invent",
                "Some Invent",
                "A JST#3")
)


fun <- function(st) strcapture("(.*)[.][^.]+$", st, list(L=""))$L



input <- input %>%
  mutate(K = fun(PROJ_ID))



while (TRUE) {
  input <- left_join(input, select(input, PROJ_ID, iss = PROJ_NAME), by = c("K" = "PROJ_ID")) %>%
    mutate(
      PROJ_NAME = if_else(is.na(iss), PROJ_NAME,
                          if_else(PROJ_ID == K, PROJ_NAME, paste(iss, PROJ_NAME, sep = "."))),
      K = fun(K)) %>%
    select(-iss)
  if (all(is.na(input$K))) break
}



input$K <- NULL



# Update the PROJ_NAME column to include repeated parts for each unique PROJ_NAME
input$PROJ_NAME <- sapply(strsplit(as.character(input$PROJ_NAME), "\\."), function(x) {
  unique_parts <- unique(x)
  paste(unique_parts, collapse = ".")
})



# Print the updated dataframe
print(input)

输出:

                   PROJ_ID                 PROJ_NAME
1                   KA0034                   A JST#3
2                KA0034.10     A JST#3.A JST#3-Dares
3         KA0034.10.110201     A JST#3.A JST#3-Dares
4     KA0034.10.110201.LOV A JST#3.A JST#3-Dares.VOM
5 KA0034.10.110201.LOV.MAX A JST#3.A JST#3-Dares.VOM
6                KA0034.FN       A JST#3.Some Invent
7         KA0034.FN.010XYZ       A JST#3.Some Invent
8     KA0034.FN.010XYZ.LEX       A JST#3.Some Invent
9 KA0034.FN.010XYZ.LEX.NAT       A JST#3.Some Invent

需要的输出:

                   PROJ_ID                                             PROJ_NAME
1                   KA0034                                               A JST#3
2                KA0034.10                                 A JST#3.A JST#3-Dares
3         KA0034.10.110201                   A JST#3.A JST#3-Dares.A JST#3-Dares
4     KA0034.10.110201.LOV               A JST#3.A JST#3-Dares.A JST#3-Dares.VOM
5 KA0034.10.110201.LOV.MAX A JST#3.A JST#3-Dares.A JST#3-Dares.VOM.A JST#3-Dares
6                KA0034.FN                                   A JST#3.Some Invent
7         KA0034.FN.010XYZ                       A JST#3.Some Invent.Some Invent
8     KA0034.FN.010XYZ.LEX           A JST#3.Some Invent.Some Invent.Some Invent
9 KA0034.FN.010XYZ.LEX.NAT   A JST#3.Some Invent.Some Invent.Some Invent.A JST#3

在这里,后缀(最后一个句点之后的部分)被连接到前缀字符串值.

例如:

  1. KA0034.10.110201.LOVVOM(LOV是后缀)
  2. KA0034.10.110201JST#3-Dares(110201是后缀)
  3. 同样,KA0034.10JST#3-Dares(10是后缀)
  4. KA0034等于A JST#3

因此,结果字符串为A JST#3.A JST#3-Dares.A JST#3-Dares.VOM

推荐答案

问题是你的iss在每次迭代中都会更新.您应该保存PROJ_NAMEpaste()的原始副本.

input <- input %>%
  mutate(K = fun(PROJ_ID),
         saved_proj_name=PROJ_NAME) 


while (TRUE) {
  input <- left_join(input, select(input, PROJ_ID, iss = saved_proj_name), by = c("K" = "PROJ_ID")) %>%
    mutate(
      PROJ_NAME = if_else(is.na(iss), PROJ_NAME,
                          paste(iss, PROJ_NAME, sep = ".")),
      K = fun(K)) %>%
    select(-iss)
  if (all(is.na(input$K))) break
}

print(input)
                   PROJ_ID                                             PROJ_NAME    K saved_proj_name
1                   KA0034                                               A JST#3 <NA>         A JST#3
2                KA0034.10                                 A JST#3.A JST#3-Dares <NA>   A JST#3-Dares
3         KA0034.10.110201                   A JST#3.A JST#3-Dares.A JST#3-Dares <NA>   A JST#3-Dares
4     KA0034.10.110201.LOV               A JST#3.A JST#3-Dares.A JST#3-Dares.VOM <NA>             VOM
5 KA0034.10.110201.LOV.MAX A JST#3.A JST#3-Dares.A JST#3-Dares.VOM.A JST#3-Dares <NA>   A JST#3-Dares
6                KA0034.FN                                   A JST#3.Some Invent <NA>     Some Invent
7         KA0034.FN.010XYZ                       A JST#3.Some Invent.Some Invent <NA>     Some Invent
8     KA0034.FN.010XYZ.LEX           A JST#3.Some Invent.Some Invent.Some Invent <NA>     Some Invent
9 KA0034.FN.010XYZ.LEX.NAT   A JST#3.Some Invent.Some Invent.Some Invent.A JST#3 <NA>         A JST#3

R相关问答推荐

IQR()和stats之间四分位距计算的差异::分位数()在R和' ggpubr '

将一个载体的值相加,直到达到另一个载体的值

根据固定值范围在tible中添加新行

变量计算按R中的行更改

管道末端运行功能

在使用ggroove后,将图例合并在gplot中

一小时满足条件的日期的 Select

将. xlsx内容显示为HTML表

您是否可以将组添加到堆叠的柱状图

如何将使用rhandsontable呈现的表值格式化为百分比,同时保留并显示完整的小数精度?

提高圣彼得堡模拟的速度

有没有办法一次粘贴所有列

如何计算每12行的平均数?

ggplot R:X,Y,Z使用固定/等距的X,Y坐标绘制六边形热图

在ggplot2上从多个数据框创建复杂的自定义图形

多元正态分布的计算

有没有办法将基于每个值中出现的两个关键字或短语的字符串向量重新编码为具有这两个值的新向量?

如何在内联代码中添加额外的空格(R Markdown)

具有自定义仓位限制和计数的GGPLATE直方图

从两个数据帧中,有没有办法计算R中一列的唯一值?