在 Tableau 中与 R 一起使用脚本实函数

Script Real Function in Use with R in Tableau

我正在开发一个在线 class,它提供以下功能以通过 R 包查找异常值:

if SCRIPT_REAL(
   "library(mvoutlier);
    sign2(cbind(.arg1))$wfinal01",
    sum([Profit])) = 0
then "Outlier"
else "Normal"
end

class 并没有很好地解释这里发生的事情。

我知道他们是这个函数的两个参数:字符串和表达式。

我相信该字符串是 R 代码。因此加载了 mvoutlier 库,一个分号告诉 Tableau 中断到一个新命令,而 sign2 是 mvoutlier 包中的一个函数,它将在大型数据集中查找离群值。

我认为 cbind(.arg1) 正在与 Tableau 通信,它应该使用当前使用的数据集以及变量 wfinal01。

第二个参数汇总了利润总额。

所以有几个问题:

  1. 我是对的,还是偏离了所有这些?
  2. 为什么我们要汇总利润以找出异常值,然后说如果它等于 0 那么它们就是异常值?

class只是使用Tableau自带的店铺数据作为示例文件。

查看 documentation('manual' link)中的 mvoutlier::sign2() 函数。它采用仅由 numeric 个变量组成的数据集(matrixdata frame,在 R 语言中)和 returns 三个输出的列表。其中一个输出称为 wfinal01,它是一个由 1 和 0 组成的向量,其中值为 0 表示数据集中的相应行包含潜在的多变量离群值。

cbind() 是一个 R 函数(与 mvoutlier 包无关),它将几个列向量作为参数,用逗号分隔,并将它们组合成一个 "data frame",它在 R 之外表示 table 或矩阵。

SCRIPT_REAL() 在这种情况下有两个参数。首先,引号中的 R 代码。其次,sum(profit) 变量。

所以发生的事情是这样的:

  1. SCRIPT_REAL() 将变量 sum(profit)(大概加载在 Tableau 的某处)插入 R 中的以下函数:sign2(cbind(.arg1))。所以 .arg1 被替换为 sum(profit)

  2. R 识别 sum(profit)(或 .arg1 中的任何替代项)和 returns(除其他事项外)1 和0 称为 wfinal01.

  3. if() 检查 wfinal01 = 0 的情况并相应地输出。

唯一的问题是:R 代码没有 运行!如果 sign2() 输入的不是 table(数据框)或矩阵,它会报错:Error in svd(xs) : infinite or missing values in 'x'。在您的情况下,我认为 sum(profit) 只是一个变量,一个单列向量,这意味着 sign2() 被馈送到单列,因此会返回同样的错误。

我只能猜测,不必要的 cbind() 函数被放在那里是为了试图欺骗 sign2() 认为它被输入矩阵而不是单个向量。但是,当我自己在 R 中使用虚拟数据尝试时,这并没有解决问题。

出现错误是因为 sign2() 检查 多变量 异常值。当你只有一个变量时,寻找那些是没有意义的。

此代码 运行 在 Tableau 中对您来说是否没有错误?这是 R 中为后代提供的可重现示例。


library(mvoutlier)

#> Loading required package: sgeostat
#> sROC 0.1-2 loaded

x = sign2(iris[1:4])

x$wfinal01

#>   [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1
#>  [36] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
#>  [71] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
#> [106] 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1
#> [141] 1 1 1 1 1 1 1 1 1 1

sign2(cbind(iris$Sepal.Length))

#> Error in svd(xs): infinite or missing values in 'x'