... and just for fun, here is a non-string version (more appropriate for complex state labels??):
gvec <- 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 <- cbind(init, as.matrix(expand.grid(rep(list(states),ntimes -2 ))),final) if(!repeats) out[ apply(out,1,\(x)all(x[-1] != x[-ntimes])), ] else out } yielding: > gvec(4, letters[1:5], "b", "e", repeats = TRUE) init Var1 Var2 final [1,] "b" "a" "a" "e" [2,] "b" "b" "a" "e" [3,] "b" "c" "a" "e" [4,] "b" "d" "a" "e" [5,] "b" "e" "a" "e" [6,] "b" "a" "b" "e" [7,] "b" "b" "b" "e" [8,] "b" "c" "b" "e" [9,] "b" "d" "b" "e" [10,] "b" "e" "b" "e" [11,] "b" "a" "c" "e" [12,] "b" "b" "c" "e" [13,] "b" "c" "c" "e" [14,] "b" "d" "c" "e" [15,] "b" "e" "c" "e" [16,] "b" "a" "d" "e" [17,] "b" "b" "d" "e" [18,] "b" "c" "d" "e" [19,] "b" "d" "d" "e" [20,] "b" "e" "d" "e" [21,] "b" "a" "e" "e" [22,] "b" "b" "e" "e" [23,] "b" "c" "e" "e" [24,] "b" "d" "e" "e" [25,] "b" "e" "e" "e" > > gvec(4, letters[1:5], "b", "e", repeats = FALSE) init Var1 Var2 final [1,] "b" "c" "a" "e" [2,] "b" "d" "a" "e" [3,] "b" "e" "a" "e" [4,] "b" "a" "b" "e" [5,] "b" "c" "b" "e" [6,] "b" "d" "b" "e" [7,] "b" "e" "b" "e" [8,] "b" "a" "c" "e" [9,] "b" "d" "c" "e" [10,] "b" "e" "c" "e" [11,] "b" "a" "d" "e" [12,] "b" "c" "d" "e" [13,] "b" "e" "d" "e" :-) -- Bert On Mon, Sep 4, 2023 at 2:04 PM Bert Gunter <bgunter.4...@gmail.com> wrote: > 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.