为什么可以';当数据集在sparklyr中时,我是否将双冒号运算符与dplyr一起使用?

为什么可以';当数据集在sparklyr中时,我是否将双冒号运算符与dplyr一起使用?,r,apache-spark,dplyr,sparklyr,R,Apache Spark,Dplyr,Sparklyr,一个可复制的示例(改编自@forestfanjoe的答案): TL;DR因为您的代码根本不使用dplyr::if_else sparkyr在示例中使用时,将Spark视为另一个数据库,并使用发出查询 在此上下文中,if_else不是作为函数处理的,而是转换为SQL原语的标识符: dbplyr::translate_sql(if_else(PaymentHistory < 0, 0,if_else(PaymentHistory > 1,1, PaymentHistory))) # &l

一个可复制的示例(改编自@forestfanjoe的答案):


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

sparkyr
在示例中使用时,将Spark视为另一个数据库,并使用发出查询

在此上下文中,
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
dplyr::if_else(mpg<20,1,0)中出现错误:找不到对象“mpg”
如果您包含一个简单的示例输入和所需的输出,可以用来测试和验证可能的解决方案,那么就更容易为您提供帮助。您似乎一开始没有使用dplyr的
if_else
,您当前是否正在使用另一个包含
if_else
功能的软件包?还是你自己定义的?if_else上的F1向您展示了什么?我无法在示例数据上重现该问题。我使用的唯一软件包是dplyr和Sparkyr。我确信如果“else”来自dplyr。@MrFlick是的,当我用原生data.frame运行相同的代码时,一切都很好。
 Error in dplyr::if_else(PaymentHistory < 0, 0, dplyr::if_else(PaymentHistory >  : 
 object 'PaymentHistory' not found 
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
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
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))