【问题标题】:How does the R sweep function work with a multi-dimensional array?R 扫描函数如何与多维数组一起工作?
【发布时间】:2019-05-13 08:31:05
【问题描述】:

我正在尝试了解扫描函数与多维数组(4d,5d ...)一起工作的方式,特别是当边距等于维度 c(1,2),c(1,3) 的元组时 ...

例如:

x<-array(1,dim = c(2,3,4,5))
sweep(x, STATS=_, MARGIN= c(1,2), FUN='*')

这里的 STATS 维度应该是多少? 以及它是如何工作的?

【问题讨论】:

  • 您能否进一步解释一下您所说的此处的 STATS 的维度是什么?
  • 我的意思是什么可接受的尺寸可以在没有警告“正确尺寸”的情况下工作?

标签: r multidimensional-array


【解决方案1】:

STATS 中给出的统计数据的维度应该与 MARGINalizing 输入数组中的数据所产生的维度相同,或者尽管不推荐,但大小应该是该结果中的元素(例如,2x3 数组中的长度为 2;或 2x4x3 数组中的 2x4 数组;或 2x4x3 数组中的 2x2 数组等)。

为了理解MARGINalizing数据产生的维度,我们来看一个例子:

# Example data in a 3D array of size 2x3x4
set.seed(1717)
x = array(runif(2*3*4), c(2,3,4))

# We MARGINalize the data by computing the mean on all dimensions *other than*
# the stated ones: (1, 3)
# This gives a 2D result whose dimension is of size
# "length of dim 1" x "length of dim 3", i.e. 2x4
marginalize_on_dims = c(1,3)
m = apply(x, marginalize_on_dims, mean)

这会产生以下 2x4 “均值”数组:

> m
          [,1]      [,2]     [,3]      [,4]
[1,] 0.3662613 0.2971481 0.155660 0.5121214
[2,] 0.5808111 0.7322553 0.662044 0.4984720

我们现在从原始 x 数组中扫除计算均值 m

x_swept_out_of_means_m = sweep(x, STATS=m, MARGIN=marginalize_on_dims)

导致:

> x_swept_out_of_means_m
, , 1

           [,1]       [,2]      [,3]
[1,] -0.2934119 -0.3224825 0.6158943
[2,] -0.4540748  0.1814070 0.2726678

, , 2

           [,1]      [,2]        [,3]
[1,] -0.1452443 0.3631910 -0.21794673
[2,] -0.1205201 0.0873856  0.03313448

, , 3

              [,1]        [,2]        [,3]
[1,] -0.0766162667 -0.14700413  0.22362039
[2,]  0.0006661599  0.05828265 -0.05894881

, , 4

           [,1]       [,2]       [,3]
[1,]  0.2341822 -0.4071083  0.1729261
[2,] -0.2680816  0.4772658 -0.2091843

我们现在注意到,扫出结果的摘要显示平均值为0,这与减去平均值一致:

> summary(x_swept_out_of_means_m)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-0.45407 -0.21137 -0.02914  0.00000  0.19196  0.61589 

因此,在您的示例中,由于您在维度 1 和 2 上边缘化,您应该使用维度为 2x3 的 STATS 值,例如:

x <- array(1, dim=c(2,3,4,5))
sweep(x, STATS=matrix(nrow=c(2,3), data=c(2,3,-2,4,0,-3)), MARGIN=c(1,2), FUN='*')

结果应该是一个 2x3x4x5 数组,下面的 2x3 数组重复 4x5 次:

         [,1] [,2] [,3]
[1,]    2   -2    0
[2,]    3    4   -3

会话信息:

> sessionInfo()
R version 3.5.2 (2018-12-20)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

【讨论】:

猜你喜欢
  • 2015-10-20
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 2011-04-07
相关资源
最近更新 更多