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函数中做同样的事情
答案 0 :(得分:0)
我认为sweep
的作用存在误解;请查看帖子How to use the sweep function中的一些出色示例。</ p>
最重要的是,您既需要汇总统计信息(具有合适的维,请参见下文),也需要数学运算,根据该运算,您可以从输入矩阵“清除”该汇总统计信息。
在您的情况下,摘要统计信息是长度为length(ak) = 3
的向量。因此,您可以使用ak
中定义的数学运算从a
扫描FUN
;我们如何进行扫描取决于MARGIN
;由于a
是3x3
矩阵,因此我们可以从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个条目。