【问题标题】:how to use STATS in sweep function of R如何在 R 的扫描功能中使用 STATS
【发布时间】:2018-12-16 05:35:09
【问题描述】:

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

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 函数中做同样的事情

【问题讨论】:

标签: r indexing


【解决方案1】:

我认为对于sweep 的作用存在误解;请查看How to use the sweep function 的帖子以获取一些很好的示例。

最重要的是,您需要一个汇总统计量(合适的维度,见下文)和一个数学运算,您可以根据该运算从输入矩阵中“扫描”该汇总统计量。

在您的情况下,汇总统计量是长度为length(ak) = 3 的向量。因此,您可以使用FUN 中定义的数学运算从a 中扫描ak;我们如何扫视取决于MARGIN;因为a 是一个3x3 矩阵,我们可以按列或按行从a 中扫描ak

如果是前者

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 个条目。

【讨论】:

  • "第一个函数参数 x 指的是 a 的选定向量(这里是列向量,因为 MARGIN = 2);第二个函数参数 y 指的是向量 ak。这就是我一直在寻找的。虽然我事先想通了。非常感谢您解释用户定义函数的使用。这对于进行大数据处理的人来说非常有用(我有 45000 列;-))
  • @ankitjoshi 不用担心。很高兴为您提供帮助并祝您工作顺利:-)
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 2011-03-27
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 2022-10-25
相关资源
最近更新 更多