如何从数组返回具有条件的值,形状与输入数组相同?

时间:2019-02-27 10:16:31

标签: arrays r

我有这个数组:

arr <- array(data = c(0.1, 0.52, 0.3, 0.4, 0.15, 0.2, 0.7, 0.8), dim = c(2, 2, 2)) 


  > arr
         , , 1

             [,1] [,2]
        [1,] 0.10  0.3
        [2,] 0.52  0.4

       , , 2

            [,1] [,2]
       [1,] 0.15  0.7
       [2,] 0.20  0.8

我想测试arr [,, 1]和[,, 2]的对应值中是否存在大于0.5的值,因此如果不返回NA,请返回该值。 适用于0.10; 0.15(在这种情况下,返回NA,因为它们都不是> 0.5),然后转到0.3; 0.7(在元素> 0.5时,返回0.7,因为它们是开的),等等

我的愿望输出1矩阵2 * 2:

 res1= #resturn the value
       [,1] [,2]
[1,]    NA    0.7
[2,]    0.52    0.8  

和另一个矩阵2 * 2显示索引 res2 =返回该值的索引

     [,1] [,2]
[1,]    NA   1
[2,]    1    2

1表示0.7来自第一矩阵arr [,, 1]

2表示0.8来自第二矩阵arr [,, 2]等

2 个答案:

答案 0 :(得分:0)

f <- function(x,a){
  x[x < a] <- NA 
  x[!is.na(x)] <- 1
  return(x)
}

arr <- array(data = c(0.1, 0.52, 0.3, 0.4, 0.3, 0.2, 0.7, 0.8), dim = c(2, 2, 2))

arr[1,,]

for(i in 1:dim(arr)[2]){
  for(j in 1:dim(arr)[3]){
    arr[,i,j] <- f(arr[,i,j],0.5)
  }
}

arr[1,,]

我敢肯定有更有效的方法,但这行得通。

答案 1 :(得分:0)

编辑::这是一个过于hacky的解决方案:

df2<-as.data.frame(arr)
df3<-as.data.frame(apply(df2,2,function(x)ifelse(x>0.5,x,NA)))
mat<-as.matrix(df3[,purrr::map_lgl(df3,~sum(is.na(.x))<=1)])
row(mat)

结果:

> mat
       V1  V4
[1,]   NA 0.7
[2,] 0.52 0.8
> row(mat)
     [,1] [,2]
[1,]    1    1
[2,]    2    2

原始

我们可以使用plyr

plyr::aaply(arr,c(1,2),function(x) ifelse(x>0.5,x,NA))

结果:

, ,  = 1

   X2
X1     1  2
  1   NA NA
  2 0.52 NA

, ,  = 2

   X2
X1   1   2
  1 NA 0.7
  2 NA 0.8