[英]R fastdummies equivalent in sparkR
我有一個包含以下數據的 Spark 數據框:
categories
1 John
2 Luis
3 Dora
為此,我需要創建一個熱門結局版本:
categories categories_Dora categories_John categories_Luis
1 John 0 1 0
2 Luis 0 0 1
3 Dora 1 0 0
這是我目前的代碼:
test <- data.frame("SN" = 1:2, "Age" = c(21,15), "Name" = c("John;Luis","Dora"))
df <- as.DataFrame(test)
df_2 = selectExpr(df, "split(Name, ';') AS categories","Name")
dat <- df_2 %>%
mutate(categories=explode(df_2$categories)) %>%
select("categories")
我目前的解決方案是將其轉換為常規 R 數據幀,並應用快速虛擬函數。 這適用於這種情況,但不適用於大型數據集:
r_df = dat %>%
SparkR::collect()
dummy_r = dummy_cols(r_df)
如何使用 sparkR 數據幀獲得相同的結果?
編輯:我不能只使用 sparklyr sparkR
它可以使用 Sparklyr 來完成,它具有許多公開的特征轉換器功能。
library(sparklyr)
test <- data.frame("categories" = c("John", "Luis","Dora"))
sc <- sparklyr::spark_connect(master = "local")
d_tbl <- copy_to(sc, test, overwrite = TRUE)
d_tbl %>%
ft_string_indexer(input_col = "categories", output_col = "cat_num") %>%
mutate(cat_num = cat_num + 1) %>%
ft_one_hot_encoder("cat_num", "cat_onehot") %>%
sdf_separate_column("cat_onehot",
paste("categories", pull(., categories), sep="_")) %>%
select(-cat_num, -cat_onehot)
輸出:
# Source: spark<?> [?? x 4]
categories categories_John categories_Luis categories_Dora
<chr> <dbl> <dbl> <dbl>
1 John 0 0 0
2 Luis 0 1 0
3 Dora 0 0 1
ft_string_indexer
生成一個列名cat_num
,其中包含每個類別的數值。 與 R 中的as.numeric(factor)
非常相似。+1 只是讓索引從 1 到ft_one_hot_encoder
在 Spark 級別發揮了神奇作用,該函數返回一個矢量化值,如帶有編碼的列表。 函數sdf_separate_column
將編碼擴展到列。 paste
使用類別級別生成列名。 select
刪除轉換中使用的不必要的列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.