Well, if strings with repeats (as you defined them) are to be excluded, I think it's simple just to use regular expressions to remove them.
e.g. g <- function(ntimes, states, init, final, repeats = TRUE) ## ntimes: integer, number of unique times ## states: vector of unique states ## init: initial state ## final: final state { out <- do.call(paste0,c(init,expand.grid(rep(list(states), ntimes-2)), final)) if(!repeats) out[-grep(paste(paste0(states,states), collapse = "|"),out)] else out } So: > g(4, LETTERS[1:5], "B", "E", repeats = FALSE) [1] "BCAE" "BDAE" "BEAE" "BABE" "BCBE" "BDBE" "BEBE" "BACE" [9] "BDCE" "BECE" "BADE" "BCDE" "BEDE" Perhaps not the most efficient way to do this, of course. Cheers, Bert On Mon, Sep 4, 2023 at 12:57 PM Eric Berger <ericjber...@gmail.com> wrote: > My initial response was buggy and also used a deprecated function. > Also, it seems possible that one may want to rule out any strings where > the same state appears consecutively. > I say that such a string has a repeat. > > myExpand <- function(v, n) { > do.call(tidyr::expand_grid, replicate(n, v, simplify = FALSE)) > } > > no_repeat <- function(s) { > v <- unlist(strsplit(s, NULL)) > sum(v[-1]==v[-length(v)]) == 0 > } > > f <- function(states, nsteps, first, last, rm_repeat=TRUE) { > if (nsteps < 3) stop("nsteps must be at least 3") > out <- paste(first, > myExpand(states, nsteps-2) |> > apply(MAR=1, \(x) paste(x, collapse="")), > last, sep="") > if (rm_repeat) { > ok <- sapply(out, no_repeat) > out <- out[ok] > } > out > } > > f(LETTERS[1:5],4,"B","E") > > # [1] "BABE" "BACE" "BADE" "BCAE" "BCBE" "BCDE" "BDAE" "BDBE" "BDCE" > "BEAE" "BEBE" "BECE" "BEDE" > > On Mon, Sep 4, 2023 at 10:33 PM Bert Gunter <bgunter.4...@gmail.com> > wrote: > >> Sorry, my last line should have read: >> >> If neither this nor any of the other suggestions is what is desired, I >> think the OP will have to clarify his query. >> >> Bert >> >> On Mon, Sep 4, 2023 at 12:31 PM Bert Gunter <bgunter.4...@gmail.com> >> wrote: >> >>> I think there may be some uncertainty here about what the OP requested. >>> My interpretation is: >>> >>> n different times >>> k different states >>> Any state can appear at any time in the vector of times and can be >>> repeated >>> Initial and final states are given >>> >>> So modifying Tim's expand.grid() solution a bit yields: >>> >>> g <- function(ntimes, states, init, final){ >>> ## ntimes: integer, number of unique times >>> ## states: vector of unique states >>> ## init: initial state >>> ## final: final state >>> do.call(paste0,c(init,expand.grid(rep(list(states), ntimes-2)), final)) >>> } >>> >>> e.g. >>> >>> > g(4, LETTERS[1:5], "B", "D") >>> [1] "BAAD" "BBAD" "BCAD" "BDAD" "BEAD" "BABD" "BBBD" "BCBD" >>> [9] "BDBD" "BEBD" "BACD" "BBCD" "BCCD" "BDCD" "BECD" "BADD" >>> [17] "BBDD" "BCDD" "BDDD" "BEDD" "BAED" "BBED" "BCED" "BDED" >>> [25] "BEED" >>> >>> If neither this nor any of the other suggestions is not what is desired, >>> I think the OP will have to clarify his query. >>> >>> Cheers, >>> Bert >>> >>> On Mon, Sep 4, 2023 at 9:25 AM Ebert,Timothy Aaron <teb...@ufl.edu> >>> wrote: >>> >>>> Does this work for you? >>>> >>>> t0<-t1<-t2<-LETTERS[1:5] >>>> al2<-expand.grid(t0, t1, t2) >>>> al3<-paste(al2$Var1, al2$Var2, al2$Var3) >>>> al4 <- gsub(" ", "", al3) >>>> head(al3) >>>> >>>> Tim >>>> >>>> -----Original Message----- >>>> From: R-help <r-help-boun...@r-project.org> On Behalf Of Eric Berger >>>> Sent: Monday, September 4, 2023 10:17 AM >>>> To: Christofer Bogaso <bogaso.christo...@gmail.com> >>>> Cc: r-help <r-help@r-project.org> >>>> Subject: Re: [R] Finding combination of states >>>> >>>> [External Email] >>>> >>>> The function purrr::cross() can help you with this. For example: >>>> >>>> f <- function(states, nsteps, first, last) { >>>> paste(first, unlist(lapply(purrr::cross(rep(list(v),nsteps-2)), >>>> \(x) paste(unlist(x), collapse=""))), last, sep="") } f(LETTERS[1:5], >>>> 3, "B", "E") [1] "BAE" "BBE" "BCE" "BDE" "BEE" >>>> >>>> HTH, >>>> Eric >>>> >>>> >>>> On Mon, Sep 4, 2023 at 3:42 PM Christofer Bogaso < >>>> bogaso.christo...@gmail.com> wrote: >>>> > >>>> > Let say I have 3 time points.as T0, T1, and T2.(number of such time >>>> > points can be arbitrary) In each time point, an object can be any of 5 >>>> > states, A, B, C, D, E (number of such states can be arbitrary) >>>> > >>>> > I need to find all possible ways, how that object starting with state >>>> > B (say) at time T0, can be on state E (example) in time T2 >>>> > >>>> > For example one possibility is BAE etc. >>>> > >>>> > Is there any function available with R, that can give me a vector of >>>> > such possibilities for arbitrary number of states, time, and for a >>>> > given initial and final (desired) states? >>>> > >>>> > ANy pointer will be very appreciated. >>>> > >>>> > Thanks for your time. >>>> > >>>> > ______________________________________________ >>>> > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see >>>> > https://stat/ >>>> > .ethz.ch%2Fmailman%2Flistinfo%2Fr-help&data=05%7C01%7Ctebert% >>>> 40ufl.edu >>>> > %7C25cee5ce26a8423daaa508dbad51c402%7C0d4da0f84a314d76ace60a62331e1b84 >>>> > %7C0%7C0%7C638294338934034595%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAw >>>> > MDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sda >>>> > ta=TM4jGF39Gy3PH0T3nnQpT%2BLogkVxifv%2Fudv9hWPwbss%3D&reserved=0 >>>> > PLEASE do read the posting guide >>>> > http://www.r/ >>>> > -project.org%2Fposting-guide.html&data=05%7C01%7Ctebert%40ufl.edu >>>> %7C25 >>>> > cee5ce26a8423daaa508dbad51c402%7C0d4da0f84a314d76ace60a62331e1b84%7C0% >>>> > 7C0%7C638294338934034595%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiL >>>> > CJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=5n >>>> > PTLmsz0lOz47t41u578t9oI0i7BOgIX53yx8CesLs%3D&reserved=0 >>>> > and provide commented, minimal, self-contained, reproducible code. >>>> >>>> ______________________________________________ >>>> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see >>>> https://stat.ethz.ch/mailman/listinfo/r-help >>>> PLEASE do read the posting guide >>>> http://www.r-project.org/posting-guide.html >>>> and provide commented, minimal, self-contained, reproducible code. >>>> ______________________________________________ >>>> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see >>>> https://stat.ethz.ch/mailman/listinfo/r-help >>>> PLEASE do read the posting guide >>>> http://www.R-project.org/posting-guide.html >>>> and provide commented, minimal, self-contained, reproducible code. >>>> >>> [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.