在 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。
第二个参数汇总了利润总额。
所以有几个问题:
- 我是对的,还是偏离了所有这些?
- 为什么我们要汇总利润以找出异常值,然后说如果它等于 0 那么它们就是异常值?
class只是使用Tableau自带的店铺数据作为示例文件。
查看 documentation('manual' link)中的 mvoutlier::sign2() 函数。它采用仅由 numeric
个变量组成的数据集(matrix
或 data frame
,在 R 语言中)和 returns 三个输出的列表。其中一个输出称为 wfinal01
,它是一个由 1 和 0 组成的向量,其中值为 0 表示数据集中的相应行包含潜在的多变量离群值。
cbind()
是一个 R 函数(与 mvoutlier
包无关),它将几个列向量作为参数,用逗号分隔,并将它们组合成一个 "data frame",它在 R 之外表示 table 或矩阵。
SCRIPT_REAL()
在这种情况下有两个参数。首先,引号中的 R 代码。其次,sum(profit)
变量。
所以发生的事情是这样的:
SCRIPT_REAL()
将变量 sum(profit)
(大概加载在 Tableau 的某处)插入 R 中的以下函数:sign2(cbind(.arg1))
。所以 .arg1
被替换为 sum(profit)
。
R 识别 sum(profit)
(或 .arg1
中的任何替代项)和 returns(除其他事项外)1 和0 称为 wfinal01
.
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'
我正在开发一个在线 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。
第二个参数汇总了利润总额。
所以有几个问题:
- 我是对的,还是偏离了所有这些?
- 为什么我们要汇总利润以找出异常值,然后说如果它等于 0 那么它们就是异常值?
class只是使用Tableau自带的店铺数据作为示例文件。
查看 documentation('manual' link)中的 mvoutlier::sign2() 函数。它采用仅由 numeric
个变量组成的数据集(matrix
或 data frame
,在 R 语言中)和 returns 三个输出的列表。其中一个输出称为 wfinal01
,它是一个由 1 和 0 组成的向量,其中值为 0 表示数据集中的相应行包含潜在的多变量离群值。
cbind()
是一个 R 函数(与 mvoutlier
包无关),它将几个列向量作为参数,用逗号分隔,并将它们组合成一个 "data frame",它在 R 之外表示 table 或矩阵。
SCRIPT_REAL()
在这种情况下有两个参数。首先,引号中的 R 代码。其次,sum(profit)
变量。
所以发生的事情是这样的:
SCRIPT_REAL()
将变量sum(profit)
(大概加载在 Tableau 的某处)插入 R 中的以下函数:sign2(cbind(.arg1))
。所以.arg1
被替换为sum(profit)
。R 识别
sum(profit)
(或.arg1
中的任何替代项)和 returns(除其他事项外)1 和0 称为wfinal01
.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'