【发布时间】:2016-06-25 02:41:49
【问题描述】:
我有一个通过 dplyr 设置的 sql 表,如下所示:
num gameday_link stand b_height px pz type
1 1 gid_2016_04_05_houmlb_nyamlb_1 R 5-6 0.194 3.225 B
2 1 gid_2016_04_05_houmlb_nyamlb_1 R 5-6 0.510 1.965 S
3 1 gid_2016_04_05_houmlb_nyamlb_1 R 5-6 -1.367 2.459 B
我想做的是添加一个名为正确的附加列,其中包含名为 isCallCorrectV 的自定义函数的 T 或 F 结果。 isCallCorrectV 的参数是表中的列。
下面是 isCallCorrectV 的一个例子:
> isCallCorrectV(c(0.0, 2.5), c(2.5, 0), c("S", "B"), c("6-0", "5-0"), c("R", "L"))
[1] TRUE FALSE
我尝试使用此命令,但出现错误。
dplyr::mutate(noswings, correct = isCallCorrectV(px, pz, type, b_height, stand))
Error in sqliteSendQuery(conn, statement) :
error in statement: no such function: ISCALLCORRECTV
【问题讨论】:
-
为函数提供代码,不要让R中的拼写区分大小写。
-
听起来您正在使用 SQLite 后端?这不适用于用 R 编写的自定义函数。如果您查看 dplyr's vignette on databses,您可以找到
dplyr知道如何转换为 SQL 的 R 函数列表(而isCallCorrect不在该列表中)。 -
如果
isCallCorrect仅由这些函数组成,那么您可能会在mutate()中将其写成长格式以获得您想要的结果。这不会很友好,而且由于您的函数调用了另一个调用ldply的自定义函数,我要说这里不是一个选项。 -
您的两个选项是(1)(如您所说)将数据读入 R 并使用您的自定义 R 函数对其进行操作,或者(2)在 SQL 中重写自定义函数并在你的数据库。
-
当您使用带有
dplyr的数据库后端时,dplyr正在为您做的是将R 语法转换为SQL 语法。当您开始使用自定义函数时,dplyr只是尝试调用它们。如果您在 R 中工作并调用 R 函数,那么一切都很好。如果您正在使用 SQL 并调用 SQL 函数,那么一切都很好。但是dplyr无法将任意R代码翻译成SQL,所以你的自定义函数需要匹配后端语言(并且在后端定义)。