【问题标题】:"Could someone please define "sweep" without using the word "sweep" in the definition?“有人可以在定义中不使用“扫地”一词来定义“扫地”吗?
【发布时间】:2019-12-11 12:41:44
【问题描述】:

问题在于,诸如“扫描”之类的函数定义通常以提供很少进一步信息的方式进行解释。 “扫”“扫”东西。我不知道这是什么意思,通过阅读定义几乎没有机会找出它的含义。

【问题讨论】:

标签: r


【解决方案1】:

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 跨单元格应用该函数。

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 2014-08-31
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多