r-在sparklyr中的spark数据帧的所有列上应用if-else变异函数



如何在sparklyr中的spark数据帧的所有列上应用if-else-amutate函数?例如,假设我想将iris数据帧中小于2的所有值转换为0。除了sparklyr,还有很多方法可以做到这一点,但对于sparklyr,这似乎有点复杂。我尝试了一种使用以下自定义功能的方法:

iris_sdf <- sdf_copy_to(sc, iris, overwrite = TRUE)
iris_num_sdf <- iris_sdf %>% select(-Species)
recode_val <- function(x) ifelse(x < 2, 0, x)
iris_num_sdf %>% mutate_all(funs(recode_val))

但收到一个错误This function is neither a registered temporary function nor a permanent function registered in the database 'default'.; line 1 pos 7 Error : org.apache.spark.sql.AnalysisException:

我使用spark_apply尝试了以下操作,但得到了毫无意义的结果。

iris_num_sdf %>% 
spark_apply(recode_val, context = {colName <- colnames(iris_num_sdf)})

我在下面也试过了,这似乎奏效了,但我希望能有更优雅的东西。

convert_x <- function(col){
col <- sym(col)
iris_num_sdf %>% mutate({{col}} := ifelse({{col}} < 2, 0, {{col}})) %>% select({{col}})
}
col_list <- colnames(iris_num_sdf)
out <- lapply(col_list, convert_x)
do.call(sdf_bind_cols, out)

您可以尝试这种方法-

library(dplyr)
convert_x <- function(col){
iris_num_sdf %>% transmute({{col}} := ifelse(.data[[col]] < 2, 0,.data[[col]]))
}
col_list <- colnames(iris_num_sdf)
result <- purrr::map_dfc(col_list, convert_x)

基本R选项-

recode_val <- function(x) ifelse(x < 2, 0, x)
out <- do.call(rbind, lapply(iris_num_sdf, recode_val))

相关内容

  • 没有找到相关文章

最新更新