【问题标题】:How to cross-paste all combinations of two vectors (each-to-each)?如何交叉粘贴两个向量的所有组合(每个对每个)?
【发布时间】:2013-06-17 18:30:27
【问题描述】:

我需要粘贴两个字符向量中的所有元素组合,“每个”到“每个”:而不是

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

我想得到

[1] "ac" "ad" "bc" "bd"

我该怎么做?

谢谢。

【问题讨论】:

  • 这可能是微不足道的,但我找不到函数paste0。我猜paste0 <- function(...){paste(..., sep="")},对吗?
  • paste0 是在 R 2.15.0 中添加的,它是一个(稍微)更快的粘贴版本,默认分隔符为空字符串。
  • @AdamHyland 哇,我完全错过了,谢谢!

标签: r


【解决方案1】:

你也可以这样做:

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

do.callouter 都是有价值的函数。 :)

或者,我们可以分配

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

不知道长度。

更多编辑!

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

也为您提供所需的订单。

【讨论】:

  • 有没有办法粘贴两个以上的字符串?
【解决方案2】:

试试这个:

x <- c("a", "b")
y <- c("c", "d")

do.call(paste0, expand.grid(x, y))
# [1] "ac" "bc" "ad" "bd"

xy 很长时,它可能比outer 慢,但另一方面它允许以下概括:

z <- c("e", "f")

do.call(paste0, expand.grid(x, y, z))
# [1] "ace" "bce" "ade" "bde" "acf" "bcf" "adf" "bdf"

【讨论】:

  • 您可以为outer 编写一个递归包装器,它将对任意数量的输入执行此操作。它比expand.grid 更丑陋(见here 第一次剪辑),但它更快。但是,正如我注意到的,您可以在大约 1/20 秒内运行您的 sn-p 200,000 次,所以它可能没问题。 :)
  • @Julius,您的回答非常方便(+1)。但是,有没有办法保持顺序 - 比如在命名列等时?对于例如上面,如果要求的顺序是"ac" "ad" "bc" "bd"?就我而言,我有一些需要以特定顺序粘贴在一起的单词(以保留含义)。谢谢!
  • @rmk,这样做的最佳方法是注意到expand.grid 在某种意义上使用与您需要的相反的顺序,因此do.call(paste0, expand.grid(y, x)[2:1]) 应该可以工作。同样,例如expand.grid(z, y, x)[3:1].
  • @Julius:太棒了!非常感谢。
【解决方案3】:

另一个(不太常用的)咒语:

levels(interaction(x,y,sep=""))
# [1] "ac" "bc" "ad" "bd"

【讨论】:

    【解决方案4】:

    这个也可以。

    comb <- function(x,y) 
             {
              x1 <- rep(x, each=length(y))
              y1 <- rep(y, times=length(x))
              paste0(x1,y1)
             }
    comb(2:4, 5:7)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多