在sparklyr中创建虚拟变量?

时间:2016-12-08 12:28:27

标签: r apache-spark dplyr plyr sparklyr

我正在努力扩大我的一些ML管道,我喜欢闪烁开启的rstudio,spark和h2o的组合(http://spark.rstudio.com/

我想弄清楚的一件事是如何使用sparklyr从数据框中的字符向量创建虚拟cols。

我已经尝试了以下但我认为它可能会混合一些尚未实现的闪光器功能。

library(sparklyr)
library(dplyr)

sc <- spark_connect(master = "local")

flights_tbl <- copy_to(sc, nycflights13::flights, "flights")

flights_tbl %>% bind_cols(as_data_frame(setNames(lapply(unique(flights_tbl$carrier), 
                                               function(x){as.integer(flights_tbl$carrier == x)}), 
                                        paste0('var2_', levels(flights_tbl$carrier)))))

在这个例子中,我想为每个运营商创建指标变量。

老实说,我对dplyr并不熟悉,所以不确定我是怎么做的。

是否可能存在已经退出的spark函数,我可以通过sparklyr扩展调用,或者是否有办法只使用dplyr函数执行此操作?

更新

我想我有办法在pyspark中对数据框执行此操作(如果对任何人都有用)。

因此,如果数据如下:

>>> df.show(20)
+------------+----------+------+-----------+
|        word|word_count|corpus|corpus_date|
+------------+----------+------+-----------+
|  profession|         1|hamlet|       1600|
|      augury|         1|hamlet|       1600|
|undertakings|         1|hamlet|       1600|
|     surmise|         1|hamlet|       1600|
|    religion|         1|hamlet|       1600|
|    advanced|         1|hamlet|       1600|
|    Wormwood|         1|hamlet|       1600|
|   parchment|         1|hamlet|       1600|
|     villany|         1|hamlet|       1600|
|        digs|         1|hamlet|       1600|
| authorities|         1|hamlet|       1600|
|      Popp'd|         1|hamlet|       1600|
|  retrograde|         1|hamlet|       1600|
|       tax'd|         1|hamlet|       1600|
|        tomb|         1|hamlet|       1600|
|       moral|         1|hamlet|       1600|
| foreknowing|         1|hamlet|       1600|
|  dreadfully|         1|hamlet|       1600|
|      parted|         1|hamlet|       1600|
|      willow|         1|hamlet|       1600|
+------------+----------+------+-----------+

然后以下似乎可以在[word]字段上制作假人:

categories = df.select("word").distinct().rdd.flatMap(lambda x: x).collect()

exprs = [F.when(F.col("word") == category, 1).otherwise(0).alias(category) for category in categories]

df_dummies = df.select("word", *exprs).limit(1000)

取自(pyspark matrix with dummy variables

2 个答案:

答案 0 :(得分:1)

这些可能是自原始帖子以来的新内容。 ml_函数有ml_create_dummy_variables,可以很好地完成工作

iris_tbl <- copy_to(sc, iris)

iris_dum <- ml_create_dummy_variables(iris_tbl, "Species")

iris_dum %>% select(contains("Species")) %>% head

> 
Source:   query [6 x 4]
Database: spark connection master=local[4] app=lol local=TRUE

  Species Species_setosa Species_versicolor Species_virginica
    <chr>          <dbl>              <dbl>             <dbl>
1  setosa              1                  0                 0
2  setosa              1                  0                 0
3  setosa              1                  0                 0
4  setosa              1                  0                 0
5  setosa              1                  0                 0
6  setosa              1                  0                 0

他们感到羞耻<dbl>而非<int>,但通过as.integer电话很容易解决。

答案 1 :(得分:0)

我不熟悉sparklyr,但为分类变量创建虚拟功能确实在Spark中实现。

Spark的One Hot Encoder接收一列$ n $整数索引并创建$ n-1 $对应的虚拟列。如果您的数据仍然是R中的字符串/因子形式,您可能必须首先使用Spark的StringIndexer将其转换为索引(请参阅上面的链接)。