我想将其转换为
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。 有什么想法吗?
答案 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