【问题标题】:How to remove columns from each matrix in a list of matrices in R?如何从R中矩阵列表中的每个矩阵中删除列?
【发布时间】:2012-05-03 12:48:02
【问题描述】:

我对在 R 中使用 list 函数不是很熟悉。这是我第一次使用矩阵列表。我正在尝试从矩阵列表中的每个矩阵中删除相同的列,但我不确定这如何与 R 中的索引一起使用。

现在我的列表中有 8 个矩阵。每个矩阵是 [120, 56]。我想从每个矩阵中删除 rows 列 17-40 和 49-56。因此,我最终会得到一个包含 [120, 24] 的 8 个矩阵的列表。

这是我拥有的矩阵列表的示例:

MatrixList <- list(maxT = matrix(1:56, 120, 56, byrow = TRUE),
        minT = matrix(1:56, 120, 56, byrow = TRUE),
        meanT = matrix(1:56, 120, 56, byrow = TRUE),
        rain24 = matrix(1:56, 120, 56, byrow = TRUE),
        rain5d = matrix(1:56, 120, 56, byrow = TRUE),
        maxT2 = matrix(1:56, 120, 56, byrow = TRUE),
        minT2 = matrix(1:56, 120, 56, byrow = TRUE),
        meanT2 = matrix(1:56, 120, 56, byrow = TRUE))

我知道这似乎是一个简单的问题,但我是新手,只是不确定如何结合使用 for 循环和内部索引来删除列。我宁愿学习如何有效地做到这一点,而不是单独为每个矩阵做这件事,然后创建列表。

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: r list matrix indexing


    【解决方案1】:

    lapply() 是要使用的函数,“技巧”是使用“TRUE”作为第一个参数来获取所有行,然后使用负索引来删除列:

    smallerMtx <- lapply(MatrixList, "[", TRUE, -c(17:40 , 49:56))
    str(smallerMtx )
    #------------
    List of 8
     $ maxT  : int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ...
     $ minT  : int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ...
     $ meanT : int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ...
     $ rain24: int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ...
     $ rain5d: int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ...
     $ maxT2 : int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ...
     $ minT2 : int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ...
     $ meanT2: int [1:120, 1:24] 1 1 1 1 1 1 1 1 1 1 ...
    

    我想我们需要解决您是否真的要删除行或列。 (您在第一句话中说的是列,但后来似乎说的是行。您的示例/请求的数字部分建议删除列,但也许您来自首先指定列的编程传统????

    【讨论】:

      【解决方案2】:

      通常情况下,@DWin 很早就给出了很好的答案。这是我简单的头脑发现更容易理解的替代方案。

      您可以使用lapply 遍历您的列表,然后使用[ 运算符进行标准子集化。

      而不是使用[ 运算符作为函数(如@DWin 所建议的那样),我更喜欢在lapply 中编写一个匿名函数,它看起来与您为转换列表中的单个元素(即子集)所执行的操作完全相同单个矩阵):

      mls <- lapply(MatrixList, function(x)x[-c(17:40, 49:56), ])
      str(mls)
      
      List of 8
       $ maxT  : int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ...
       $ minT  : int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ...
       $ meanT : int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ...
       $ rain24: int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ...
       $ rain5d: int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ...
       $ maxT2 : int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ...
       $ minT2 : int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ...
       $ meanT2: int [1:88, 1:56] 1 1 1 1 1 1 1 1 1 1 ...
      

      【讨论】:

      • 感谢您的贡献。尽管 DWin 有一个可行的解决方案,但您的回答对我来说更容易理解。
      • 如果 OP 不理解我们的解决方案是绝对等价的,那只会延迟他对 R 工作原理的理解。 (而且我怀疑我的速度更快,尽管在这种规模的问题上没有任何意义。)
      • 并不是我不明白它们是等价的,只是我还是很在 abc 编程和跳到 ac 编程的地步,即使效率更高,也更多一个挑战。我想这只是因为我倾向于认为编程更像是 Andrie 的解决方案。也就是说,我很高兴能用“[”学习真正的“技巧”。这就是为什么我对两者都投了赞成票。再次感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      相关资源
      最近更新 更多