2017-05-06 116 views
1

我有以下矩阵:在阵列中使用逻辑子阵

xx <- array(rnorm(120), dim = c(2, 3, 4, 5)) 

ii <- array(sample(1:5, replace = T, size = 24), dim = c(2,3,4)) 

现在,我要让XX是NA在所有那些II < 3.本应不分第四维的发生条目。有没有一种简单的方法可以使用R的逻辑数组或其他函数来完成此操作?

回答

3

假设xxii总是有除的xx末维相同的尺寸,那么这应该做的,由于自行车规则:

xx[ii < 3] <- NA 
+0

太好了!这就是我正在寻找的东西,但我想它只能起作用,因为最后一个索引是重复的索引。 – user3236841

+0

是的。这只适用于两个数组在最后一个维度上不同的情况。 – Psidom

+0

我想我只能标记两个答案中的一个正确,虽然这两个工作。坏消息! – user3236841

2

这里是apply的方法。基本上,沿着第四维应用逻辑操作。 psidom的答案更有效率,但这种方法更加灵活,您需要循环使用不同的维度。

xxNA <- array(apply(xx, 4, function(x) {is.na(x) <- ii < 3; x}), dim=dim(xx)) 

的逻辑操作,is.na(xx) ii < 3,分配NA到II小于3

检查了几个尺寸

xx[,,,1] 
, , 1 

      [,1]  [,2]  [,3] 
[1,] -1.2070657 1.084441 0.4291247 
[2,] 0.2774292 -2.345698 0.5060559 

, , 2 

      [,1]  [,2]  [,3] 
[1,] -0.5747400 -0.5644520 -0.4771927 
[2,] -0.5466319 -0.8900378 -0.9983864 

, , 3 

      [,1]  [,2]  [,3] 
[1,] -0.77625389 0.9594941 -0.5110095 
[2,] 0.06445882 -0.1102855 -0.9111954 

, , 4 

      [,1]  [,2]  [,3] 
[1,] -0.8371717 0.1340882 -0.4405479 
[2,] 2.4158352 -0.4906859 0.4595894 

的变成

xxNA[,,,1] 
, , 1 

      [,1]  [,2]  [,3] 
[1,] -1.207066  NA 0.4291247 
[2,]  NA -2.345698 0.5060559 

, , 2 

      [,1]  [,2]  [,3] 
[1,] -0.5747400 -0.5644520 -0.4771927 
[2,] -0.5466319 -0.8900378 -0.9983864 

, , 3 

    [,1]  [,2] [,3] 
[1,] NA   NA NA 
[2,] NA -0.1102855 NA 

, , 4 

      [,1]  [,2]  [,3] 
[1,] -0.8371717 0.1340882 -0.4405479 
[2,] 2.4158352  NA   NA 

的任何元件ii是

ii 
, , 1 

    [,1] [,2] [,3] 
[1,] 3 2 5 
[2,] 2 4 3 

, , 2 

    [,1] [,2] [,3] 
[1,] 4 5 3 
[2,] 3 4 3 

, , 3 

    [,1] [,2] [,3] 
[1,] 2 1 2 
[2,] 2 3 1 

, , 4 

    [,1] [,2] [,3] 
[1,] 3 5 3 
[2,] 3 1 2 

数据

set.seed(1234) 
xx <- array(rnorm(120), dim = c(2, 3, 4, 5)) 

ii <- array(sample(1:5, replace = T, size = 24), dim = c(2,3,4)) 
+0

谢谢!我认为这是一个更普遍的解决方案,尽管Psidom对于特定的问题更加优雅。 – user3236841