【发布时间】:2019-12-11 12:41:44
【问题描述】:
问题在于,诸如“扫描”之类的函数定义通常以提供很少进一步信息的方式进行解释。 “扫”“扫”东西。我不知道这是什么意思,通过阅读定义几乎没有机会找出它的含义。
【问题讨论】:
-
@kslew,这个问题是它是如何使用的,但这个问题是它的作用。
标签: r
问题在于,诸如“扫描”之类的函数定义通常以提供很少进一步信息的方式进行解释。 “扫”“扫”东西。我不知道这是什么意思,通过阅读定义几乎没有机会找出它的含义。
【问题讨论】:
标签: r
sweep() 函数逐行 (MARGIN = 1) 或列 (MARGIN = 2) 遍历矩阵,并执行您想要的一些操作(由 FUN 定义)获取 (STATS) 的输入。因此,它对于跨具有不同输入的行/列执行某些操作 (FUN) 很有用。
在 cmets 中使用 d.b. 的示例,假设您有一个 3x3 矩阵,全为 0:
m <- matrix(0, 3, 3)
m
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 0
[3,] 0 0 0
如果你想在第一列加 7,在第二列加 3,在第三列加 11(传递给STATS):
sweep(x = m, MARGIN = 2, STATS = c(7, 3, 11), FUN = "+")
[,1] [,2] [,3]
[1,] 7 3 11
[2,] 7 3 11
[3,] 7 3 11
或者您可以按行执行 (MARGIN = 1):
sweep(x = m, MARGIN = 1, STATS = c(7, 3, 11), FUN = "+")
[,1] [,2] [,3]
[1,] 7 7 7
[2,] 3 3 3
[3,] 11 11 11
因此,当您想要跨矩阵的行/列对给定函数应用不同的值时,sweep() 函数最有用。 (注意:您也可以使用 MARGIN = 1:2 跨单元格应用该函数。
【讨论】:
如果第四个参数中给出的操作是负数,那么扫描是指从第一个参数的每一行或每一列中减去第三个参数。
特殊情况可能会更清楚。我们将使用内置的 6x2 BOD 数据框并对第四个参数使用减法。
然后sweep(BOD, 1, v, "-") 从BOD 的每一列中减去向量v,得到与BOD - cbind(v, v) 相同的结果(可以简化为BOD - v)。同样,sweep(BOD, 2, u, "-") 从BOD 的每一行中减去向量u,得到与BOD - rbind(u, u, u, u, u, u) 相同的结果。
具体来说,我们为这两种情况分别提供了几个等价的方法。
# MARGIN = 1 case. These each give identical reesults.
v <- rowMeans(BOD) # any vector having length of nrows(BOD) would work
sweep(BOD, 1, v, "-")
BOD - cbind(v, v)
BOD - matrix(v, nrow(BOD), ncol(BOD))
cbind(BOD[1] - v, BOD[2] - v)
BOD - v
在 MARGIN=2 的情况下,它从每一行中减去向量 u。除非另有说明,否则这些都给出相同的结果。
# MARGIN = 2 case. These each give identical results except as noted.
u <- colMeans(BOD) # any vector of length ncol(BOD) will work
sweep(BOD, 2, u, "-")
BOD - rbind(u, u, u, u, u, u)
BOD - matrix(u, nrow(BOD), ncol(BOD), byrow = TRUE)
rbind(BOD[1, ] - u, BOD[2, ] - u, BOD[3, ] - u, BOD[4, ] - u,
BOD[5, ] - u, BOD[6, ] - u)
mapply("-", BOD, u) # matrix rather than data.frame
scale(BOD, scale = FALSE) # matrix rather than data.frame
【讨论】: