【问题标题】:How to extract the value from matrix cell without "subscript out of bounds" error?如何从矩阵单元中提取值而不会出现“下标越界”错误?
【发布时间】:2017-11-12 11:34:16
【问题描述】:

我有 my.data 矩阵,它由 32 列和大约 23000 行组成。我想从 10 列和 20 列中提取特定的单元格值,所以我使用了 for 循环:

 for (i in 1:nrow(my.data)) {
  day <- as.numeric(my.data[i,10])
  night <- as.numeric(my.data[i,20])
  sum <- day+night
  if (sum > 2200 ) {
    my.data <- my.data [-i,]
  }
}

但显示“my.data[i, 10] 中的错误:下标超出范围”。你能解释一下有什么问题吗?谢谢!

【问题讨论】:

    标签: r for-loop matrix


    【解决方案1】:

    负索引会删除元素,因此您的 my.data 矩阵会变小,而 i 仍会尝试访问原始数据中存在的所有行。

    > matrix(1:9, 3,3)
         [,1] [,2] [,3]
    [1,]    1    4    7
    [2,]    2    5    8
    [3,]    3    6    9
    > matrix(1:9, 3,3)[-1,]
         [,1] [,2] [,3]
    [1,]    2    5    8
    [2,]    3    6    9
    > x <- matrix(1:9, 3,3)
    > x
         [,1] [,2] [,3]
    [1,]    1    4    7
    [2,]    2    5    8
    [3,]    3    6    9
    > x[-1, ]
         [,1] [,2] [,3]
    [1,]    2    5    8
    [2,]    3    6    9
    >
    

    尝试:

    i <- 1
    while (i <= nrow(my.data)) {
      day <- as.numeric(my.data[i,10])
      night <- as.numeric(my.data[i,20])
      sum <- day+night
      if (sum > 2200 ) {
        my.data <- my.data [-i,]
      }
      i <- i + 1
    } 
    

    更新: 或使用更多 R 之类的解决方案:

    row_idx <- ( as.numeric(my.data[, 10]) + 
                 as.numeric(my.data[, 20]) ) <= 2200
    my.data <- my.data[row_idx, ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-04
      • 2020-06-03
      • 2019-08-26
      • 2020-03-02
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多