【问题标题】:sparklyr and standard evaluation (SE) based functionssparklyr 和基于标准评估 (SE) 的函数
【发布时间】:2018-02-12 17:41:41
【问题描述】:

我正在尝试编写一个函数来执行 sdf_pivot() a 创建一个 Spark DataFrame,其列名包含原始变量或列的名称。

set.seed(80)
df <- data.frame(id = c(1:5),
                 var1 = sample(LETTERS[1:12], 5, replace = TRUE),
                 var2 = sample(LETTERS[13:16], 5, replace = TRUE))

ref <- copy_to(sc, df, "mytbl")
glimpse(ref)

Observations: 5
Variables: 3
$ id   <int> 1, 2, 3, 4, 5
$ var1 <chr> "F", "G", "J", "A", "H"
$ var2 <chr> "M", "O", "O", "O", "O"

这是var1 的预期结果,无需编写函数:

ref %>% 
  dplyr::select(id, var1) %>%
  dplyr::mutate(newvar1 = paste0("var1_",var1)) %>%
  sparklyr::sdf_pivot(formula = id ~ newvar1, fun.aggregate = "count") %>% 
  sparklyr::na.replace(0)

# Source:   table<sparklyr_tmp_56f96ab7d507> [?? x 6]
# Database: spark_connection
     id var1_A var1_F var1_G var1_H var1_J
  <int>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
1     1      0      1      0      0      0
2     3      0      0      0      0      1
3     5      0      0      0      1      0
4     4      1      0      0      0      0
5     2      0      0      1      0      0

在我的一个函数版本下,当然不起作用,我也尝试过quotedeparse,但我被mutate_sdf_pivot 卡住了。

myPivotFunction <- function(sdf, varname, newvarname){

  mutate_op <- paste0(newvarname," = ", "var1_", varname)

  sdf %>% 
    dplyr::select_(.dots = list('id', varname)) %>%
    mutate_(.dots = setNames(newvarname, mutate_op)) %>%
    sparklyr::sdf_pivot(formula = id ~ newvar1, fun.aggregate = "count") %>% 
    sparklyr::na.replace(0)
}

【问题讨论】:

    标签: apache-spark dplyr sparklyr non-standard-evaluation standard-evaluation


    【解决方案1】:

    一点点rlang 应该可以解决问题:

    library(rlang)
    library(glue)
    
    myPivotFunction <- function(sdf, varname, newvarname){
      exprs <- c("id", glue('paste0("var1_", {varname})')) %>% 
        setNames(c("id", newvarname)) %>% 
        lapply(parse_quosure)
    
      sdf %>%
        transmute(!!! exprs) %>%
        sdf_pivot(
          formula = as.formula(glue("id ~ {newvarname}")), 
          fun.aggregate = "count") %>%
        na.replace(0)
    }
    

    【讨论】:

    • 效果很好!谢谢!,您知道是否有解释使用 dplyr 进行 SE 和 SNE 编程的参考文档? select_、filter_、summarise_等方法?
    • 关于glue() 中的硬编码"var1_",我可以构建所需的字符串,比如str1,使用varname arg 并执行glue(str1);我也可以去掉 newvarname 作为函数的参数,只需将其替换为 "tmpvar"setNames()tmpvaras.formula(glue(...))
    • TBH 首先我不明白var1_ 部分的意义何在。它看起来更像是重命名的工作。
    • 有可能做到这一点,但 fun.aggregate 是一个“总和”吗?这可能是一个新问题...
    猜你喜欢
    • 2015-03-10
    • 1970-01-01
    • 2019-03-23
    • 2013-02-04
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    相关资源
    最近更新 更多