【问题标题】:Sparklyr on Databricks - taking a mean of multiple columns rowwise on a sparklyr data frame with many NaN valuesDatabricks 上的 Sparklyr - 在具有许多 NaN 值的 sparklyr 数据帧上逐行取多列的平均值
【发布时间】:2020-02-11 21:22:42
【问题描述】:

我正在尝试为 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 中止了这项工作。有人可以帮忙吗?

【问题讨论】:

    标签: r dplyr databricks sparklyr azure-databricks


    【解决方案1】:

    对于可变列,您可以使用HIVE'sgreatest()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
    

    【讨论】:

    • 该代码适用于 R 数据帧和 Spark 数据帧。如果您想使用 Spark,请确保使用 sparklyr 使用 spark_read_*() 函数或 copy_to() 加载 df_train。
    • 感谢您的回复。我返回了一个错误: min 中的错误(EncodingMean,EncodingMean1,EncodingMean2,:min 中的错误(EncodingMean,EncodingMean1,EncodingMean2,:未使用的参数(EncodingMean1,EncodingMean2,EncodingMean3,EncodingMean4)我认为这可能归结为 NaN 值我已经合并了 na.replace 并且仍然返回错误。任何其他建议都会很棒
    • 如果你想要所有列的最小/最大/平均值,你也可以运行sdf_describe(df_train, cols = c("name-of-column-1", "name-of-column-2", "name-of-column-3))。否则,由于此响应中的代码一次只工作一列,但您可以按照min_col_1 = min(name_of_column_1, na.rm = TRUE), min_col_2 = min(name_of_column_2, na.rm = TRUE) 之类的模式显式计算更多列
    • 也许我忘了提到每一行的平均值。我的意思是应该从 Encoded1,Encoded2,Encoded3,Encoded4 计算一个平均值。
    • 啊,我明白了。更新了答案,以按行而不是按列反映平均、最小值。
    猜你喜欢
    • 2019-01-01
    • 2021-06-23
    • 1970-01-01
    • 2022-12-19
    • 2016-04-16
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多