【问题标题】:Using a custom function inside of dplyr mutate?在 dplyr mutate 中使用自定义函数?
【发布时间】: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,所以你的自定义函数需要匹配后端语言(并且在后端定义)。

标签: r dplyr


【解决方案1】:

根据@Gregor 的 cmets,不能在 sql 数据库的 dplyr 中使用自定义函数。只能使用定义here的函数。

所以我的选择是:

(1) 将数据读入 R 并使用您的自定义 R 函数对其进行操作,或者 (2) 在 SQL 中重写自定义函数并在您的数据库中定义它们

我可以使用 dplyr collect 命令将数据读入 R。

【讨论】:

  • 断链,好像不存在了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2015-02-05
  • 2020-05-31
  • 2018-12-29
  • 1970-01-01
相关资源
最近更新 更多