2017-11-10 12 views

答えて

2

Spark 2.2.0または2.1.0には、scala、javaおよびpythonのデータ前処理に必要なスケーラがあります。しかしR(SparkR)にはまだスケーラがありません。したがって、私はデータフレームの列を拡大する2つの関数を書いています。

機能1:

# max abs scaler function (R dataframe to Spark Dataframe) 
maxabsscaler <- function(df, cols, scalingUpperLimit){ 
    for(i in cols){ 
    max <- max(df[i]) 
    df[i] <- (df[, c(i)]/max) * scalingUpperLimit 
    } 
    return(as.DataFrame(df)) 
} 

機能2:

# max abs scaler function (Only Spark Dataframe) 
maxabsscaler2 <- function(df, cols, scalingUpperLimit){ 
    createOrReplaceTempView(df, "df_tmp") 
    for(i in columns){ 
    max <- collect(sql(paste("SELECT MAX(", i ,") FROM df_tmp")))[[1]] 
    df[[i]] <- df[[i]]/max * scalingUpperLimit 
    } 
    return(df) 
} 

注:この関数を呼び出すときに必要なので機能1があなたのデスクトップアプリケーションやテスト環境に適していますスパークデータフレームをRデータフレームに変換する。 Rデータフレームは1台のコンピュータで実行されます。したがって、大きなデータセットには適していません。関数2では、スパークデータフレームをRデータフレームに変換する必要はありません。したがって、この機能を運用環境に導入することができます。関数はNA値を扱うことができません。しかし、それらを改善することができます。列とscalingUpperLimit(100,10、1など)パラメータを指定する必要があります。

使用例:

survival_of_patients <- read.df("D:\\projects\\R\\data\\survival_of_patients.csv", "csv", header = "true") 

trainTest <-randomSplit(survival_of_patients, c(0.8, 0.2), 42) 
train = trainTest[[1]] 
test = trainTest[[2]] 

columns <- colnames(as.data.frame(train))[!colnames(as.data.frame(train)) %in% c("SurvivalStatus")] 

train <- maxabsscaler(as.data.frame(train), columns, 10) 
test <- maxabsscaler(as.data.frame(test), columns, 10) 

# or 
# train <- maxabsscaler2(train, columns, 10) 
# test <- maxabsscaler2(test, columns, 10) 

あなたは、このデータセットをダウンロードして、機能をテストすることができます。 https://archive.ics.uci.edu/ml/datasets/Haberman%27s+Survival

関連する問題