【问题标题】:Convert a string separate by . and +转换由 分隔的字符串。和 +
【发布时间】:2023-03-07 18:47:01
【问题描述】:

我想转换这个:

v_in <- 'A+B+C.E+F.G'

进入这个:

v_out <- 'A.E.G+A.F.G+B.E.G+B.F.G+C.E.G+C.F.G'

使用 R。 有什么想法吗?

【问题讨论】:

  • 你会给你的问题取什么标题?您能否进一步详细说明使用的逻辑?
  • 我同意@NelsonGon 的更多细节请求。目前尚不清楚您如何从v_inv_out。规则是什么?
  • 另一个例子:FRA+DEU.VAR1+VAR2.A 变成 FRA.VAR1.A+FRA.VAR2.A+DEU.VAR.A+DEU.VAR2.A
  • 我自己找到的,谢谢大家
  • 您能否看看下面的答案并接受您想要的答案,以便我们考虑关闭?您还应该添加您的解决方案

标签: r string


【解决方案1】:

一步一步这样更清楚,你可以使用以下:

v_in2=strsplit(v_in,"\\.")[[1]]                        # split by points
v_in3=sapply(v_in2,function(x) strsplit(x,"\\+")[[1]]) # split each by +
v_in4=expand.grid(v_in3)                               # combine all variables of each group
v_in5=do.call(paste,v_in4)                             # paste combinations
v_out=paste(gsub(" ","\\.",v_in5),collapse="+")        # change spaces for . and paste all together by +
> v_out
[1] "A.E.G+B.E.G+C.E.G+A.F.G+B.F.G+C.F.G"

【讨论】:

  • 非常感谢(我的解决方案使用 2 并且比你的不那么优雅)
【解决方案2】:

这是一个想法,但在您的示例中可能有点过拟合。但是,由于缺乏有关规则的信息,我无法概括它。

l1 <- strsplit(strsplit(v_in, '.', fixed = TRUE)[[1]][-1], '+', fixed = TRUE)
i2 <- c(outer(l1[[1]], l1[[2]], function(x, y) paste(x, y, sep = '.')))
i3 <- gsub('\\..*', '', strsplit(v_in, '+', fixed = TRUE)[[1]])

paste(t(outer(i3[-length(i3)], i2, function(x, y) paste(x, y, sep = '.'))), collapse = '+')
#[1] "A.E.G+A.F.G+B.E.G+B.F.G+C.E.G+C.F.G"

【讨论】:

    【解决方案3】:

    我认为循环运行良好的情况之一:

    v_out <- v_in        
    for(spl in c(".","+")) {
        v_out <- unlist(lapply(v_out, strsplit, spl, fixed=TRUE),rec=FALSE)
    }
    eg <- expand.grid(v_out)
    eg <- eg[do.call(order,eg),]
    paste(do.call(paste, c(eg,sep=".")),collapse="+")
    #[1] "A.E.G+A.F.G+B.E.G+B.F.G+C.E.G+C.F.G"
    

    对于仍在等待模式解释的任何人,这可能会有所帮助:

    @ @ @ : : $
    A+B+C.E+F.G
    @     :   $   A.E.G
    @       : $   A.F.G
      @   :   $   B.E.G
      @     : $   B.F.G
        @ :   $   C.E.G
        @   : $   C.F.G
    

    【讨论】:

      猜你喜欢
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      相关资源
      最近更新 更多