【问题标题】:How to repeat a function n times?如何重复一个函数n次?
【发布时间】:2021-11-30 16:08:47
【问题描述】:

我能够在 r 中编写一个函数来将矩阵的一列向右“移动”一列:

shift <- function(disc){
  mat <- matrix(nrow = 4, ncol = 12)
  mat[,1] <- disc[,12]
  for(i in 1:11){
    mat[,i+1] <- disc[,i] 
  }
  return(mat)
}

所以看看它是如何工作的:

> disc0
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]    2    5   10    7   16    8    7    8    8     3     4    12
[2,]    3    3   14   14   21   21    9    9    4     4     6     6
[3,]    8    9   10   11   12   13   14   15    4     5     6     7
[4,]   14   11   14   14   11   14   11   14   11    11    14    11
> shift(disc0)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]   12    2    5   10    7   16    8    7    8     8     3     4
[2,]    6    3    3   14   14   21   21    9    9     4     4     6
[3,]    7    8    9   10   11   12   13   14   15     4     5     6
[4,]   11   14   11   14   14   11   14   11   14    11    11    14

例如,如果我想换班 3 次怎么办?我可以手动执行此操作:

> x <- disc0
> x <- shift(x)
> x <- shift(x)
> x <- shift(x)
> x
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]    3    4   12    2    5   10    7   16    8     7     8     8
[2,]    4    6    6    3    3   14   14   21   21     9     9     4
[3,]    5    6    7    8    9   10   11   12   13    14    15     4
[4,]   11   14   11   14   11   14   14   11   14    11    14    11

所以现在原来的第一列 (2,3,8,14) 现在位于第四列。

但是我怎样才能自动化呢?我想写一个函数来重复我的移位函数 n 次。提前致谢

【问题讨论】:

  • replicate函数可以重复n次。

标签: r for-loop lapply


【解决方案1】:

您可以使用for 循环 -

n <- 3
for(i in seq_len(n)) {
  disc0 <- shift(disc0)  
}
disc0

#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
#[1,]    3    4   12    2    5   10    7   16    8     7     8     8
#[2,]    4    6    6    3    3   14   14   21   21     9     9     4
#[3,]    5    6    7    8    9   10   11   12   13    14    15     4
#[4,]   11   14   11   14   11   14   14   11   14    11    14    11

【讨论】:

    【解决方案2】:

    你可以写一个函数来接受 shift 参数:

    shift <- function(x, num = 1){
      n <- ncol(x)
      x[, c((n - num +1):n, 1:(n - num))] 
    }
    
    mat
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    [1,]    1    2    3    4    5    6    7    8
    [2,]    1    2    3    4    5    6    7    8
    [3,]    1    2    3    4    5    6    7    8
    [4,]    1    2    3    4    5    6    7    8
    
    shift(mat)
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    [1,]    8    1    2    3    4    5    6    7
    [2,]    8    1    2    3    4    5    6    7
    [3,]    8    1    2    3    4    5    6    7
    [4,]    8    1    2    3    4    5    6    7
    shift(mat,2)
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    [1,]    7    8    1    2    3    4    5    6
    [2,]    7    8    1    2    3    4    5    6
    [3,]    7    8    1    2    3    4    5    6
    [4,]    7    8    1    2    3    4    5    6
    shift(mat,3)
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
    [1,]    6    7    8    1    2    3    4    5
    [2,]    6    7    8    1    2    3    4    5
    [3,]    6    7    8    1    2    3    4    5
    [4,]    6    7    8    1    2    3    4    5
    

    【讨论】:

    • @RitchieSacramento 你说得对!
    • 非常感谢!正是我想要的,而且比我写的更优雅
    • 也许添加行 num &lt;- num %% n 并在 num != 0 的情况下进行转换。
    猜你喜欢
    • 2011-11-13
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    相关资源
    最近更新 更多