How to cross-paste all combinations of two vectors (each-to-each)?

后端 未结 4 1400
伪装坚强ぢ
伪装坚强ぢ 2020-12-09 06:04

I need to paste all combinations of elements from two character vectors, \"each\" to \"each\": instead of

> paste0(c(\"a\", \"b\"), c(\"c\", \"d\"))
[1]          


        
相关标签:
4条回答
  • 2020-12-09 06:18

    Try this:

    x <- c("a", "b")
    y <- c("c", "d")
    
    do.call(paste0, expand.grid(x, y))
    # [1] "ac" "bc" "ad" "bd"
    

    It is likely to be slower than outer when x and y are long, but on the other hand it allows the following generalisation:

    z <- c("e", "f")
    
    do.call(paste0, expand.grid(x, y, z))
    # [1] "ace" "bce" "ade" "bde" "acf" "bcf" "adf" "bdf"
    
    0 讨论(0)
  • 2020-12-09 06:24

    This can also be used.

    comb <- function(x,y) 
             {
              x1 <- rep(x, each=length(y))
              y1 <- rep(y, times=length(x))
              paste0(x1,y1)
             }
    comb(2:4, 5:7)
    
    0 讨论(0)
  • 2020-12-09 06:26

    You can also do:

    outer(c("a", "b"), c("c", "d"), FUN = "paste0")[1:4]
    [1] "ac" "bc" "ad" "bd"
    

    Both do.call and outer are valuable functions to play with. :)

    Alternately, we can assign

    x <- outer(c("a", "b"), c("c", "d"), FUN = "paste0")
    dim(x) <- NULL
    x
    [1] "ac" "bc" "ad" "bd"
    

    Without knowing the length.

    More edits!

    x <- outer(c("a", "b"), c("c", "d"), FUN = "paste0")
    y <- t(x)
    dim(y) <- NULL
    y
    [1] "ac" "ad" "bc" "bd"
    

    Gets you the desired order, too.

    0 讨论(0)
  • 2020-12-09 06:26

    Another (less generally useful) incantation:

    levels(interaction(x,y,sep=""))
    # [1] "ac" "bc" "ad" "bd"
    
    0 讨论(0)
提交回复
热议问题