Databricks上的Sparklyr-在带有许多NaN值的Sparklyr数据帧上按行平均取多列

时间:2019-10-15 08:39:45

标签: r dplyr databricks sparklyr azure-databricks

我正在尝试为Sparklyr数据框创建最小值,最大值和均值列。我只想在计算中按行使用该大型数据框中的5列。列中有许多NaN值,它们可能正在计算。在标准R中,使用的代码为:

df_train$MinEncoding <- spark_apply(df_train,f=min ,columns=[,EncodingFeatures], 1, FUN=min,na.rm=TRUE)

df_train$MaxEncoding <- spark_apply(df_train[,EncodingFeatures], 1, FUN=max,na.rm=TRUE)

df_train$MeanEncoding <- spark_apply(df_train[,EncodingFeatures], 1, FUN=mean,na.rm=TRUE)

我尝试过

df_train %>% spark_apply(function(df) {dplyr::mutate(df, MeanLicenceEncoding = mean(LicenceEncodingFeatures))})

但是spark会中止工作。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

对于变量列,可以将HIVE's greatest()least()dplyrsparklyr结合使用,如下所示:

library(sparklyr)
library(dplyr)

sc <- spark_connect(master = "local")
iris <- copy_to(sc, iris)

columns <- c("Sepal_Length", "Sepal_Width")

transmute(iris,
          max = greatest(!!! rlang::parse_exprs(columns)),
          min = least(!!! rlang::parse_exprs(columns)),
          avg = sql(!! paste(paste("if(isnull(", columns, "), 0, ", columns, ")", collapse = " + "))) / !!length(columns))
# Source: spark<?> [?? x 3]
     max   min   avg
   <dbl> <dbl> <dbl>
 1   5.1   3.5  6.85
 2   4.9   3    6.4 
 3   4.7   3.2  6.3 
 4   4.6   3.1  6.15
 5   5     3.6  6.8 
 6   5.4   3.9  7.35
 7   4.6   3.4  6.3 
 8   5     3.4  6.7 
 9   4.4   2.9  5.85
10   4.9   3.1  6.45
# … with more rows