繁体   English   中英

如何从R中矩阵列表中的每个矩阵中删除列?

[英]How to remove columns from each matrix in a list of matrices in R?

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

现在我在列表中有8个矩阵。 每个矩阵是[120,56]。 我想从每个矩阵中删除 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循环和内部索引的组合来删除列。 我宁愿学习如何有效地做到这一点,而不是单独为每个矩阵做这个,然后创建列表。

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

通常情况下,@ DWin很早就得到了一个很好的答案。 这是我的简单头脑更易于理解的替代方案。

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

我不喜欢使用[ operator作为函数(如@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 ...

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 ...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM