转换一个字符串,用分隔。和+

时间:2019-07-04 08:37:33

标签: r string

我想将其转换为

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。 有什么想法吗?

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分:2)

要逐步清楚说明,可以使用以下内容:

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)

我认为循环效果很好的一种情况:

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