2012-04-22 171 views
4

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

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

这里是矩阵列表的一个例子,我有:

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

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

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

回答

7

由于通常情况下,@DWin获得与一个优秀的答案太早。这里是我的简单的头脑发现容易理解的选择。

您可以使用lapply遍历列表,然后使用[操作标准子集

而不是使用[运算符作为函数(如@DWin所示),我宁愿写一个匿名函数f在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 ... 
+0

感谢您的贡献。尽管迪文有一个可行的解决方案,但我的回答对我来说更容易。 – djhocking 2012-04-22 20:21:57

+0

如果OP不明白我们的解决方案是完全相同的,那么它只会延迟他对R的工作原理的理解。 (我怀疑我的速度更快,虽然在这个大小的问题上没有任何意义。) – 2012-04-22 23:07:11

+0

这并不是说我不明白它们是相同的,只是我仍然非常重视abc编程,即使效率更高,跳到交流节目更具挑战性。我想这只是归结为我更倾向于认为编程更像安德里的解决方案。这就是说,我非常高兴能通过“[”来学习TRUE“技巧”。这就是为什么我提高了两个。再次感谢! – djhocking 2012-04-22 23:40:19

6

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

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

+0

太棒了,完美的工作! – djhocking 2012-04-22 20:15:44