Дискретизируйте переменные, используя SparkR - PullRequest
0 голосов
/ 29 августа 2018

Я хочу дискретизировать переменную, используя R, предпочтительно SparkR, чтобы желаемые результаты были похожи на следующие.

library(arules)

mtcars %>% mutate(bins = discretize(x = mpg, method = "interval", breaks = 4))

Я проверил документ, но мог видеть не-R решения только в https://spark.apache.org/docs/2.2.0/ml-features.html#bucketizer.

Пожалуйста, сообщите.

1 Ответ

0 голосов
/ 01 сентября 2018

В целом SparkR предоставляет очень ограниченный набор функций ML (полная поддержка Spark 3.0 запланирована в виде отдельного пакета R SPARK-24359 SPIP: конвейеры ML в R , хотя такая простая дискретизация, как эта , может быть выполнен с использованием CASE ... WHEN ... операторов.

Сначала вычислите разрывы:

df <- createDataFrame(mtcars)
min_max <- df %>% 
  select(min(df$mpg), max(df$mpg)) %>% 
  collect() %>% 
  unlist() 

n <- 4
breaks <- seq(min_max[[1]], min_max[[2]], length.out = n)

Затем сгенерируйте выражение:

bucket <- purrr::map2(
    breaks[-n], breaks[-1], 
    function(x, y) between(column("mpg"), c(x, y))) %>% 
  purrr::reduce2(
    ., seq(length(.)),
    function(acc, x, y) otherwise(when(x, y), acc), 
    .init = lit(NA))

df %>% withColumn("bucket", bucket)
...