如何在R的扫描功能中使用STATS

时间:2018-07-08 08:39:17

标签: r indexing

sweep(x,MARGIN,STATS,FUN = myfun,check.margin = TRUE,…) 是否可以在用户定义的函数中使用STATS。这是mysum

a <- matrix(1:9,3)
mysum <- function (x,param){
  print(param)
  #print(x + ax)
  return (x + param)

}
ak = c(100,200,300)
a_new <- sweep(a,2,STATS = c(1,2,3),FUN = function(x,i) mysum(x,ak[i]))

我无法弄清楚如何在我的用户定义函数中使用STATS向量。我给mysum传递了第二个参数。 扫描功能的示例显示了简单的功能,例如“ +”,“-”,但没有关于如何使用用户定义的以及如何在用户定义的函数中访问STATS的线索。

我看到了一些示例,并通过作为函数(x,i)传递的索引来传递,但是如何在Sweep的STATS函数中做同样的事情

1 个答案:

答案 0 :(得分:0)

我认为sweep的作用存在误解;请查看帖子How to use the sweep function中的一些出色示例。<​​/ p>

最重要的是,您既需要汇总统计信息(具有合适的维,请参见下文),也需要数学运算,根据该运算,您可以从输入矩阵“清除”该汇总统计信息。

在您的情况下,摘要统计信息是长度为length(ak) = 3的向量。因此,您可以使用ak中定义的数学运算从a扫描FUN;我们如何进行扫描取决于MARGIN;由于a3x3矩阵,因此我们可以从ak逐列或逐行扫描a

如果是前者

sweep(a, 2, ak, FUN = "+")
#     [,1] [,2] [,3]
#[1,]  101  204  307
#[2,]  102  205  308
#[3,]  103  206  309

(如果是后者的话)

sweep(a, 1, ak, FUN = "+")
#     [,1] [,2] [,3]
#[1,]  101  104  107
#[2,]  202  205  208
#[3,]  303  306  309

在这里,我们通过将{FUN = "+"ak添加到a进行列/行扫描。


很明显,您可以定义自己的函数。例如,如果我们想将ak逐列添加到a的平方值中,则可以按以下方式使用sweep

sweep(a, 2, ak, FUN = function(x, y) x^2 + y)
#     [,1] [,2] [,3]
#[1,]  101  216  349
#[2,]  104  225  364
#[3,]  109  236  381

第一个函数自变量x指向选定的a向量(此处为列向量,因为MARGIN = 2);第二个函数参数y指向向量ak


重要的是要确保尺寸“匹配”;例如,如果我们这样做

a <- a <- matrix(1:9,3)
ak <- c(100, 200)
sweep(a, 2, ak, FUN = "+")

我们收到警告

  

警告信息:   在扫描(a,2,ak,FUN =“ +”)中:     STATS不能完全在MARGIN上回收

我们试图将ak添加到a列中,但是a有3列,而ak只有2个条目。