【问题标题】:Concatenate each element of a vector with each element of another vector将一个向量的每个元素与另一个向量的每个元素连接起来
【发布时间】:2015-07-28 12:51:06
【问题描述】:
list1 = c("X", "Y")
list2 = c("1", "2", "3")

我想要的是

c("X1", "X2", "X3", "Y1", "Y2", "Y3")

我该怎么做?有可能对此有一个包吗?我尝试了paste(),但它交替混合了条目(“X1、“Y2”、“X3”)。

【问题讨论】:

    标签: r string


    【解决方案1】:

    我们可以在vectors 上使用expand.gridouter 来获得所有组合,然后我们将paste 一起使用。

    使用expand.grid,输出是一个有两列的data.frame,我们可以使用do.call(paste0粘贴输出数据集的每一行。

     v1 <- do.call(paste0,expand.grid(list1, list2))
     v1[order(v1)]
     #[1] "X1" "X2" "X3" "Y1" "Y2" "Y3"
    

    或者如上所述outer 是另一个选项,对于此操作应该非常快。输出将是matrix,可以使用as.vectorc 将其转换回vector

     c(t(outer(list1, list2, FUN=paste0)))
     #[1] "X1" "X2" "X3" "Y1" "Y2" "Y3"
    

    另外,expand.grid 应该与 list 一起使用

     list1 <- as.list(list1)
     list2 <- as.list(list2)
     do.call(paste0, expand.grid(list1, list2))
     #[1] "X1" "Y1" "X2" "Y2" "X3" "Y3"
    

    【讨论】:

    • 我真的要掌握这个expand.grid 的东西。我总是手动操作rep...
    • @MichaelChirico。 expand.grid 是一个有用的功能。假设我们有一个包含许多元素的列表。只做list1 &lt;- list(LETTERS[1:3], LETTERS[4:5], LETTERS[6:7]); expand.grid(list1) 将获得所有可能的组合。
    • *舌头在脸颊上*但是 akrun,如果我想通过使用 rep! 来练习我的算术怎么办?
    • @MichaelChirico 我记得一个特定的问题(有时会发布)要求特定的组合并且缺少一些组合,因此我们无法使用expand.grid。在这种情况下,rep 是选项
    【解决方案2】:
    list1 = c("X", "Y")
    list2 = c("1", "2", "3")
    
    as.character(sapply(list1, FUN = function(x) paste0(x, list2)))
    
    # [1] "X1" "X2" "X3" "Y1" "Y2" "Y3"
    

    【讨论】:

    • 你可以用c(sapply(list1, paste0, list2))压缩它
    • 谢谢,我倾向于忘记使用...*apply 将参数传递给FUN 的可能性。除了偷懒,在这种情况下cas.character好还有什么原因?
    • as.vector 会更正确。但是,我只是想编写高尔夫代码 :-)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    相关资源
    最近更新 更多