gpt4 book ai didi

r - 当数据集位于 sparklyr 中时,为什么我不能将双冒号运算符与 dplyr 一起使用?

转载 作者:行者123 更新时间:2023-12-01 14:03:23 25 4
gpt4 key购买 nike

一个可重现的例子(改编自@forestfanjoe 的回答):

library(dplyr)
library(sparklyr)
sc <- spark_connect(master = "local")

df <- data.frame(id = 1:100, PaymentHistory = runif(n = 100, min = -1, max = 2))

df <- copy_to(sc, df, "payment")

> head(df)
# Source: spark<?> [?? x 2]
id PaymentHistory
* <int> <dbl>
1 1 -0.138
2 2 -0.249
3 3 -0.805
4 4 1.30
5 5 1.54
6 6 0.936

fix_PaymentHistory <- function(df){df %>% dplyr::mutate(PaymentHistory = dplyr::if_else(PaymentHistory < 0, 0, dplyr::if_else(PaymentHistory > 1,1, PaymentHistory)))}

df %>% fix_PaymentHistory

错误是:

 Error in dplyr::if_else(PaymentHistory < 0, 0, dplyr::if_else(PaymentHistory >  : 
object 'PaymentHistory' not found

我正在使用范围运算符,因为我担心 dplyr 中的名称会与某些用户定义的代码发生冲突。请注意,PaymentHistorydf 中的一个列变量。

运行以下代码时不会出现同样的错误:

fix_PaymentHistory <- function(df){
df %>% mutate(PaymentHistory = if_else(PaymentHistory < 0, 0,if_else(PaymentHistory > 1,1, PaymentHistory)))
}
> df %>% fix_PaymentHistory
# Source: spark<?> [?? x 2]
id PaymentHistory
* <int> <dbl>
1 1 0
2 2 0
3 3 0
4 4 1
5 5 1
6 6 0.936
7 7 0
8 8 0.716
9 9 0
10 10 0.0831
# ... with more rows

最佳答案

TL;DR 因为您的代码根本不使用 dplyr::if_else

sparklyr,当在示例中使用时,将 Spark 视为另一个数据库并使用 dbplyr SQL translation layer 发出查询.

在此上下文中,if_else 不被视为函数,而是被转换为 SQL 原语的标识符:

dbplyr::translate_sql(if_else(PaymentHistory < 0, 0,if_else(PaymentHistory > 1,1, PaymentHistory)))
# <SQL> CASE WHEN ("PaymentHistory" < 0.0) THEN (0.0) WHEN NOT("PaymentHistory" < 0.0) THEN (CASE WHEN ("PaymentHistory" > 1.0) THEN (1.0) WHEN NOT("PaymentHistory" > 1.0) THEN ("PaymentHistory") END) END

但是如果你传递一个完全限定的命名,它会绕过这个机制,尝试评估函数,最终失败,因为数据库列不在范围内。

I'm afraid that the name in dplyr will clash with some of the user-defined code.

如您所见,dplyr 根本不需要在此处的范围内 - 在 sparklyr 管道中调用的函数要么转换为相应的 SQL 结构,要么如果没有特定的转换规则放置,按原样传递并由 Spark SQL 引擎解析(此路径用于调用 Spark functions )。

当然,这种机制并非特定于 sparklyr,您可能会在使用由数据库支持的其他表时看到相同的行为:

library(magrittr)

db <- dplyr::src_sqlite(":memory:", TRUE)
dplyr::copy_to(db, mtcars)

db %>% dplyr::tbl("mtcars") %>% dplyr::mutate(dplyr::if_else(mpg < 20, 1, 0))
Error in dplyr::if_else(mpg < 20, 1, 0) : object 'mpg' not found

关于r - 当数据集位于 sparklyr 中时,为什么我不能将双冒号运算符与 dplyr 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52972504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com