【问题标题】:How to swap sequence in R如何在R中交换序列
【发布时间】:2020-08-07 23:00:45
【问题描述】:

我对 R 编程非常陌生,我曾尝试交换序列,但我不确定 R 中是否有函数或其他方式来交换序列。 我有这样的矢量数据

yy <- c(21,22,8,24)

然后,我想在 2 之间交换。它从第一个索引开始,分别与第二个和第三个索引交换。例如,2122 交换,218 交换,2124 交换

结果应该如下所示

22,21,8,24

8,22,21,24

24,22,8,21

21,8,22,24

21,24,8,22

22,21,24,8

【问题讨论】:

  • 你需要所有的组合吗?
  • 如果其中一个答案解决了您的问题,请accept it;这样做不仅为回答者提供了一些积分,而且还为有类似问题的读者提供了一些关闭。尽管您只能接受一个答案,但您可以选择对您认为有帮助的人进行投票。 (如果仍有问题,您可能需要编辑您的问题并提供更多详细信息。)

标签: r sequence swap


【解决方案1】:

我们可以使用embed。不清楚单行是否允许重复值

embed(c(yy, yy, yy), 6)[, 1:4]
#      [,1] [,2] [,3] [,4]
#[1,]   22   21   24    8
#[2,]    8   22   21   24
#[3,]   24    8   22   21
#[4,]   21   24    8   22
#[5,]   22   21   24    8
#[6,]    8   22   21   24
#[7,]   24    8   22   21

【讨论】:

  • 哇,这太不可思议了,阿克伦!另一个我从未听说过的基本函数,来救援!
  • 可能我不正确,但这里似乎没有交换。
【解决方案2】:
do.call(Map, c(list(f = function(a, b) replace(yy, a, yy[b])), 
               asplit(combn(length(yy), 2), 1)))
# [[1]]
# [1] 22 22  8 24
# [[2]]
# [1]  8 22  8 24
# [[3]]
# [1] 24 22  8 24
# [[4]]
# [1] 21  8  8 24
# [[5]]
# [1] 21 24  8 24
# [[6]]
# [1] 21 22 24 24

演练:

  • 生成所有要交换的索引的组合:

    combn(length(yy), 2)
    #      [,1] [,2] [,3] [,4] [,5] [,6]
    # [1,]    1    1    1    2    2    3
    # [2,]    2    3    4    3    4    4
    
  • asplit(..., 1) 将该矩阵拆分为每一行。

  • function(...) replace(...) 交换向量的两个元素。

  • Map 将函数 (f=) 应用于向量/列表中的每个元素(配对)

  • 但是因为我们需要动态生成这些列表,所以我使用do.call来创建args列表

【讨论】:

    【解决方案3】:

    你也可以这样做:

    t(combn(length(yy),2, function(y) replace(yy, rev(y), yy[y])))
    
         [,1] [,2] [,3] [,4]
    [1,]   22   21    8   24
    [2,]    8   22   21   24
    [3,]   24   22    8   21
    [4,]   21    8   22   24
    [5,]   21   24    8   22
    [6,]   21   22   24    8
    

    【讨论】:

    • 非常感谢。我会试试的。
    【解决方案4】:

    这是带有for 循环的基本 R 选项

    out <- list()
    for (i in 1:(length(yy)-1)) {
      for (j in (i+1):length(yy)) {
        out[[length(out)+1]] <- replace(yy,c(i,j),yy[c(j,i)])
      }
    }
    

    给了

    > out
    [[1]]
    [1] 22 21  8 24
    
    [[2]]
    [1]  8 22 21 24
    
    [[3]]
    [1] 24 22  8 21
    
    [[4]]
    [1] 21  8 22 24
    
    [[5]]
    [1] 21 24  8 22
    
    [[6]]
    [1] 21 22 24  8
    

    如果你想让它作为一个函数工作:

    f <- function(yy) {
    out <- list()
    for (i in 1:(length(yy)-1)) {
      for (j in (i+1):length(yy)) {
        out[[length(out)+1]] <- replace(yy,c(i,j),yy[c(j,i)])
      }
    }
    out
    }
    

    编辑

    如果你想在两个向量之间做类似的交换操作,你可以试试下面的代码

    yy <- c(21, 22, 8, 24)
    xx <- c(5, 7, 9, 12)
    
    out <- list()
    u <- c(yy, xx)
    for (i in seq_along(yy)) {
      for (j in length(yy) + seq_along(xx)) {
        z <- replace(u, c(i, j), u[c(j, i)])
        out[[length(out) + 1]] <- list(yy = z[seq_along(yy)], xx = z[-seq_along(yy)])
      }
    }
    

    这样

    > out
    [[1]]
    [[1]]$yy
    [1]  5 22  8 24
    
    [[1]]$xx
    [1] 21  7  9 12
    
    
    [[2]]
    [[2]]$yy
    [1]  7 22  8 24
    
    [[2]]$xx
    [1]  5 21  9 12
    
    
    [[3]]
    [[3]]$yy
    [1]  9 22  8 24
    
    [[3]]$xx
    [1]  5  7 21 12
    
    
    [[4]]
    [[4]]$yy
    [1] 12 22  8 24
    
    [[4]]$xx
    [1]  5  7  9 21
    
    
    [[5]]
    [[5]]$yy
    [1] 21  5  8 24
    
    [[5]]$xx
    [1] 22  7  9 12
    
    
    [[6]]
    [[6]]$yy
    [1] 21  7  8 24
    
    [[6]]$xx
    [1]  5 22  9 12
    
    
    [[7]]
    [[7]]$yy
    [1] 21  9  8 24
    
    [[7]]$xx
    [1]  5  7 22 12
    
    
    [[8]]
    [[8]]$yy
    [1] 21 12  8 24
    
    [[8]]$xx
    [1]  5  7  9 22
    
    
    [[9]]
    [[9]]$yy
    [1] 21 22  5 24
    
    [[9]]$xx
    [1]  8  7  9 12
    
    
    [[10]]
    [[10]]$yy
    [1] 21 22  7 24
    
    [[10]]$xx
    [1]  5  8  9 12
    
    
    [[11]]
    [[11]]$yy
    [1] 21 22  9 24
    
    [[11]]$xx
    [1]  5  7  8 12
    
    
    [[12]]
    [[12]]$yy
    [1] 21 22 12 24
    
    [[12]]$xx
    [1] 5 7 9 8
    
    
    [[13]]
    [[13]]$yy
    [1] 21 22  8  5
    
    [[13]]$xx
    [1] 24  7  9 12
    
    
    [[14]]
    [[14]]$yy
    [1] 21 22  8  7
    
    [[14]]$xx
    [1]  5 24  9 12
    
    
    [[15]]
    [[15]]$yy
    [1] 21 22  8  9
    
    [[15]]$xx
    [1]  5  7 24 12
    
    
    [[16]]
    [[16]]$yy
    [1] 21 22  8 12
    
    [[16]]$xx
    [1]  5  7  9 24
    

    【讨论】:

    • 非常感谢。代码是有效的,这就是我想要的。那么,如果我们需要更改数据集,我们可以将其作为函数应用吗?
    • 如果我有超过 1 个向量,例如xx
    • @sNooze 你想如何在向量之间交换号码?您能否展示该案例的预期输出并解释一下?
    • 例如,我有 2 个向量。所以,我想将 xx[1] 交换为向量 yy 中的每个索引。而 xx 则显示 yy 索引。直到完成两个向量的所有索引 yy
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 2015-09-27
    • 2022-01-18
    • 1970-01-01
    • 2020-09-23
    • 2021-10-25
    相关资源
    最近更新 更多