如何使用'扫描'功能

dou*_*oug 95 statistics r

当我查看R Packages的源代码时,我会看到sweep常用的函数.有时候,当一个更简单的函数已经足够时(例如,apply),它会被使用,有时,如果不花费相当多的时间来逐步执行代码块,就不可能确切地知道它在做什么.

我可以sweep使用更简单的函数重现效果的事实表明我不理解sweep核心用例,并且这个函数经常使用的事实表明它非常有用.

上下文:

sweep是R标准库中的一个函数; 它的论点是:

sweep(x, MARGIN, STATS, FUN="-", check.margin=T, ...)

# x is the data
# STATS refers to the summary statistics which you wish to 'sweep out'
# FUN is the function used to carry out the sweep, "-" is the default
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,参数类似于applysweep需要一个参数,STATS.

另一个关键区别是sweep返回一个与输入数组相同形状的数组,而返回的结果apply取决于传入的函数.

sweep 在行动:

# e.g., use 'sweep' to express a given matrix in terms of distance from 
# the respective column mean

# create some data:
M = matrix( 1:12, ncol=3)

# calculate column-wise mean for M
dx = colMeans(M)

# now 'sweep' that summary statistic from M
sweep(M, 2, dx, FUN="-")

     [,1] [,2] [,3]
[1,] -1.5 -1.5 -1.5
[2,] -0.5 -0.5 -0.5
[3,]  0.5  0.5  0.5
[4,]  1.5  1.5  1.5
Run Code Online (Sandbox Code Playgroud)

总而言之,我正在寻找的是一个或两个示例性用例sweep.

请不要背诵或链接到R文档,邮件列表或任何"主要"R源 - 假设我已经阅读过它们.我感兴趣的是R程序员/分析师sweep在他们自己的代码中使用的经验.

小智 75

sweep()通常在按行或按列操作矩阵时使用,而操作的其他输入对于每个行/列都是不同的值.无论是按行还是列操作,都由MARGIN定义,如同申请.用于我称之为"其他输入"的值由STATS定义.因此,对于每一行(或列),您将从STATS获取一个值并在FUN定义的操作中使用.

例如,如果要将1添加到您定义的矩阵的第1行,2到2,等等,您将执行以下操作:

sweep (M, 1, c(1: 4), "+")
Run Code Online (Sandbox Code Playgroud)

我坦率地不理解R文档中的定义,我只是通过查找示例来学习.

  • 稍微解释一下:`STATS` 似乎是这个变量的错误标签。它是 `FUN` 的输入,用于修改矩阵中每个元素的值(在本例中为 `M`)。`STATS` 可以是一个常量,也可以是一个大小与所选 `MARGIN` 大小相匹配的列表/向量等。我认为。 (3认同)

Bra*_*orn 15

sweep()可以很好地逐列或逐行系统地操作大矩阵,如下所示:

> print(size)
     Weight Waist Height
[1,]    130    26    140
[2,]    110    24    155
[3,]    118    25    142
[4,]    112    25    175
[5,]    128    26    170

> sweep(size, 2, c(10, 20, 30), "+")
     Weight Waist Height
[1,]    140    46    170
[2,]    120    44    185
[3,]    128    45    172
[4,]    122    45    205
[5,]    138    46    200
Run Code Online (Sandbox Code Playgroud)

当然,这个例子很简单,但是改变STATS和FUN参数,其他操作也是可能的.

  • 第二个参数是正在操作的边距,类似于 apply。这里,2 表示每行评估 STAT。在 apply 中,它是相反的(2 适用于列)。例如 `sweep(matrix(1:50, nrow = 5), 2, 1:10, "-")` (2认同)

Jam*_*ing 6

这个问题有点陈旧,但由于我最近遇到了这个问题,因此可以在统计函数的源代码中找到扫描的典型用法cov.wt,用于计算加权协方差矩阵.我正在看R 3.0.1中的代码.这里sweep用于在计算协方差之前减去列平均值.在代码的第19行,导出了居中向量:

 center <- if (center) 
        colSums(wt * x)
    else 0
Run Code Online (Sandbox Code Playgroud)

在第54行,它被扫出矩阵

x <- sqrt(wt) * sweep(x, 2, center, check.margin = FALSE)
Run Code Online (Sandbox Code Playgroud)

代码的作者使用默认值FUN = "-",这让我困惑了一段时间.