【问题标题】:For loop in R subsettingR子集中的for循环
【发布时间】:2021-06-23 15:58:57
【问题描述】:

我正在绞尽脑汁想弄清楚如何运行 for 循环来对矩阵进行子集化。

本质上,我有一个矩阵 m,并且想定期对数据进行子集化,最后将它们 rbind 在一起。费力的方式是这样的:

m1 <- m[7:22,2:25]
m2 <- m[30:45,2:25]
m3 <- m[53:68,2:25]
...
m100 <- .... 

m_all <- rbind(m1,m2,m3 .... m100)

如你所见,间隔是 23....

我想要一个 for 循环命令,但我不记得我在 R 课程中学到了什么。 这是我目前想到的......

for (i=2 ; i<=100; i++)
  {
  m[i] <- m[(7+{i}*23):(22+{i}*23),2:25]
  }

但我的努力失败了......

有人可以教我如何设计 for 循环命令吗?

感谢您的帮助。

【问题讨论】:

  • Hadley 的书 Advanced R 第 5 章对控制流有很好的解释。

标签: r for-loop subset


【解决方案1】:

我建议使用seq() 函数来生成序列。指定by = 选项允许您执行定期间隔。从那里您可以计算下限和上限,并使用它们对矩阵行进行子集化。

for ( i in seq(from = 7, to = 100, by = 23) ) {
    lower_bound <- i
    upper_bound <- i + 15
    print(paste("lower bound:", lower_bound, "upper bound:", upper_bound))
}

结果

[1] "lower bound: 7 upper bound: 22"
[1] "lower bound: 30 upper bound: 45"
[1] "lower bound: 53 upper bound: 68"
[1] "lower bound: 76 upper bound: 91"
[1] "lower bound: 99 upper bound: 114"

用你的矩阵子集替换正文中的打印

【讨论】:

  • 谢谢达米安。我喜欢这种方法。
  • 如果我要与诺里的以下建议合并: for ( i in seq(from = 7, to = 100, by = 23) ) { m[i]
  • 我在想这样的事情: data
【解决方案2】:

尝试mapplyseq,如下所示

m[c(mapply(seq, seq(7, 99 * 23 + 7, 23), seq(22, 99 * 23 + 22, 23))),2:25]

【讨论】:

    【解决方案3】:

    您可以使用类似的方法依次创建每个子矩阵。

    您对它们做了什么,或如何存储它们,您需要自己添加或提供更多信息。

    for (i in seq(7, 100, 23))
    {
      if (i+15< 100){
        
        sub_matrix <- m[i:(i+15),2:25]
    
      }
    }
    

    以下代码会将所有子矩阵存储在一个列表数据中。

    idx<-0
    
    m <- matrix(0L, nrow=100, ncol=30)
    
    data <- list()
    
    idx <- 1
    
    for (i in seq(7, 100, 23))
    {
      if (i+15< 100){
            
        sub_matrix <- m[i:(i+15),2:25]
        data[[idx]] <- sub_matrix
        idx<-idx+1
      }
    }
    

    【讨论】:

      【解决方案4】:

      如果我理解正确,OP 只想保留矩阵 m 的某些行。

      这种方法不是创建行的索引以选择,而是创建行的索引以从选择中排除。 p>

      在 OP 的示例中,不需要的行是 1:6, 23:29, 46:52, ...

      # create minimal, reproducible example
      m <- matrix(rep(1:70, 2L), ncol = 2L)
      
      # leave out unwanted rows 
      m_all <- m[-outer(seq(0L, NROW(m), by = 23L), 0:6, `+`), 1:2]
      m_all
      
            [,1] [,2]
       [1,]    7    7
       [2,]    8    8
       [3,]    9    9
       [4,]   10   10
       [5,]   11   11
       [6,]   12   12
       [7,]   13   13
       [8,]   14   14
       [9,]   15   15
      [10,]   16   16
      [11,]   17   17
      [12,]   18   18
      [13,]   19   19
      [14,]   20   20
      [15,]   21   21
      [16,]   22   22
      [17,]   30   30
      [18,]   31   31
      [19,]   32   32
      [20,]   33   33
      [21,]   34   34
      [22,]   35   35
      [23,]   36   36
      [24,]   37   37
      [25,]   38   38
      [26,]   39   39
      [27,]   40   40
      [28,]   41   41
      [29,]   42   42
      [30,]   43   43
      [31,]   44   44
      [32,]   45   45
      [33,]   53   53
      [34,]   54   54
      [35,]   55   55
      [36,]   56   56
      [37,]   57   57
      [38,]   58   58
      [39,]   59   59
      [40,]   60   60
      [41,]   61   61
      [42,]   62   62
      [43,]   63   63
      [44,]   64   64
      [45,]   65   65
      [46,]   66   66
      [47,]   67   67
      [48,]   68   68
      

      索引的嵌套序列由

      创建
      outer(seq(0L, NROW(m), by = 23L), 0:6, `+`)
      
           [,1] [,2] [,3] [,4] [,5] [,6] [,7]
      [1,]    0    1    2    3    4    5    6
      [2,]   23   24   25   26   27   28   29
      [3,]   46   47   48   49   50   51   52
      [4,]   69   70   71   72   73   74   75
      

      【讨论】:

        猜你喜欢
        • 2020-12-07
        • 1970-01-01
        • 2017-12-30
        • 1970-01-01
        • 1970-01-01
        • 2015-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多