【问题标题】:How to pairs the elements of two vectors in R如何在R中配对两个向量的元素
【发布时间】:2021-06-03 02:56:21
【问题描述】:

我想在 R 中配对两个向量的元素。顺序很重要。

For example, 

    X= c(1:3)
    Y= c(1:3)
I expect to have:

1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3 

我想使用“lapply”。我的数据更复杂,但想法是一样的。我只需要将第一个向量的每个元素与第二个向量的所有元素配对即可。

【问题讨论】:

  • expand.grid(Y,X)[2:1],比lapply简单直接多了。 (我在X[2:1] 之前做Y 的唯一原因是因为expand.grid 在最左边的列中是“最繁忙的”,请参阅expand.grid(X,Y) 来查看;我这样做是因为你说顺序很重要,我也在推断列顺序。)
  • 为什么没有1, 13, 3?此外,因为您在两个向量中都使用了1:3,所以不清楚每个数字是从哪里获得的。例如,x <- 1:3; y <- 4:6 的预期输出是什么?我认为您需要提供更多关于如何获得预期输出的说明。
  • @r2evans,通常我会同意,但 OP 预期输出中的“缺失”组合意味着 expand_grid 只是一个起点。
  • @Limey,我也有同样的想法,并假设一个错字......正在等待爱丽丝进来纠正我:-)
  • 在 OP 的编辑下,expand_grid绝对是最简单的方法!

标签: r


【解决方案1】:

如果“顺序很重要”表示“单调递增”很重要,那么简单

expand.grid(X, Y)
#   Var1 Var2
# 1    1    1
# 2    2    1
# 3    3    1
# 4    1    2
# 5    2    2
# 6    3    2
# 7    1    3
# 8    2    3
# 9    3    3

但是,如果列顺序(第二列在第一列之前递增),则只需颠倒参数的顺序(推断真正的问题具有不同的数字)并在函数后重新排序:

expand.grid(Y, X)[2:1]
#   Var2 Var1
# 1    1    1
# 2    1    2
# 3    1    3
# 4    2    1
# 5    2    2
# 6    2    3
# 7    3    1
# 8    3    2
# 9    3    3

列名是从参数中推断出来的,所以expand.grid(X=X, Y=Y) 会将它们命名为XY 而不是Var#

【讨论】:

  • 惊人的帮助。非常感谢。
【解决方案2】:

tidyverse中,我们可以使用expand_grid

library(tidyr)
expand_grid(Y, X)

或使用crossing

crossing(X, Y)

【讨论】:

    【解决方案3】:

    另一个基本 R 选项是 outer(但不如 expand.grid 简单)

    > do.call(rbind, c(t(outer(X, Y, Vectorize(function(x, y) list(c(x, y)))))))
          [,1] [,2]
     [1,]    1    1
     [2,]    1    2
     [3,]    1    3
     [4,]    2    1
     [5,]    2    2
     [6,]    2    3
     [7,]    3    1
     [8,]    3    2
     [9,]    3    3
    

    或者我们可以像下面这样使用lapply

    > unname(do.call(rbind, lapply(X, cbind, Y)))
          [,1] [,2]
     [1,]    1    1
     [2,]    1    2
     [3,]    1    3
     [4,]    2    1
     [5,]    2    2
     [6,]    2    3
     [7,]    3    1
     [8,]    3    2
     [9,]    3    3
    

    【讨论】:

      【解决方案4】:

      这是一个数据表解决方案:

      library(data.table)
      CJ(X, Y, unique = TRUE)
      

      输出:

         X Y
      1: 1 1
      2: 1 2
      3: 1 3
      4: 2 1
      5: 2 2
      6: 2 3
      7: 3 1
      8: 3 2
      9: 3 3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-22
        • 2018-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多