【问题标题】:How to return a value with condition from array, with same shape as input array?如何从数组返回具有条件的值,与输入数组的形状相同?
【发布时间】:2019-07-21 00:47:09
【问题描述】:

我有这个数组:

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.7,因为它在元素中 > 0.5)等等

我的愿望输出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] 等

【问题讨论】:

  • 要清楚,您不只是想知道which(arr&gt;0.5) 是否为非空。您希望返回一个形状相同的数组,其中 NA 被替换为 arr。我编辑了你的标题以反映这一点。
  • 谢谢@smci 不是真的。我不想返回具有相同形状的相同数组。但我想应用到所有元素,而不是一一应用,例如:应用到 0.10; 0.3(在这种情况下返回 NA,因为它们都不 > 0.5)然后转到 0.3;0.7(返回 0.7,因为它在元素上 > 0.5)等等。
  • Tpellim 那么简单地做which(arr&gt;0.1)which(arr&gt;0.3) 甚至for (a in seq(0.1,1.9,0.2)) { which(arr&gt;a) } 有什么问题...请更清楚地说明输出应该是什么以及它应该具有什么形状,因为a?的所有步骤?
  • 我想像 thismxd=apply(arr, c(1, 2), sum) 一样申请,但不是求和,而是看是否有 >0.5。输出是一个 2*2 相同形状的矩阵,是的。
  • 好的,但您不希望输出只是which(arr&gt;0.5) 返回的一维向量。能否请您修改标题以表达您要查找的内容?

标签: arrays r


【解决方案1】:

编辑:: 这是一个过于 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

【讨论】:

  • 你想要的输出是什么?
  • 已编辑,尽管使用了非常老套的解决方案。
  • Thanks mat 对应我想要的,但对应的索引不正确。它们应该是原始arr 中的索引。 1 means 0.7 comes from the first matrix arr[,,1]2 means 0.8 comes from the second matrix arr[,,2]
猜你喜欢
  • 2018-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多