2017-02-03 26 views
0

我有興趣在SparkR數據框中的所有列上找到缺失值的交叉表。我想利用這些數據可以使用下面的代碼的生成:在所有列中交叉列表SparkR數據框中的缺失值

數據

set.seed(2) 

# Create basic matrix 
M <- matrix(
    nrow = 100, 
    ncol = 100, 
    data = base::sample(x = letters, size = 1e4, replace = TRUE) 
) 


## Force missing vales 
M[base::sample(1:nrow(M), 10), 
    base::sample(1:ncol(M), 10)] <- NA 
table(is.na(M)) 

SparkR

之後,this answer我想在使用flatMap所需的解決辦法。這個想法是用T/F替換丟失/不丟失的值,然後爲每個變量計數出現次數。首先,它看起來flatMap沒有通過SparkR 2.1出口,所以我不得不用:::

# Import data to SparkR --------------------------------------------------- 

# Feed data into SparkR 
dtaSprkM <- createDataFrame(sqc, as.data.frame(M)) 
## Preview 
describe(dtaSprkM) 
# Missing values count ---------------------------------------------------- 

# Function to convert missing to T/F 
convMiss <- function(x) { 
    ifelse(test = isNull(x), 
      yes = FALSE, 
      no = TRUE) 
} 

# Apply 
dtaSprkMTF <- SparkR:::flatMap(dtaSprkM, isNull) 
## Derive data frame 
dtaSprkMTFres <- createDataFrame(sqc, dtaSprkMTF) 

二來挖掘出來,運行代碼後失敗,出現以下錯誤信息:

Error in (function (classes, fdef, mtable) : 
    unable to find an inherited method for function ‘isNull’ for signature ‘"list"’ 

期望結果

在R中的普通數據幀上,可以通過以下方式實現期望的結果:

sapply(as.data.frame(M), function(x) { 
    prop.table(table(is.na(x))) 
}) 

我喜歡的靈活性tableprop.table報價,我非常希望能夠通過SparkR在類似的靈活性到達。的NULL

回答

1

計算分數每列:

fractions <- select(dtaSprkM, lapply(columns(dtaSprkM), function(c) 
    alias(avg(cast(isNotNull(dtaSprkM[[c]]), "integer")), c) 
) 

這將創建一個單排Data.Frame可以安全地收集,並容易局部地改變形狀,例如具有tidyr

library(tidyr) 

fractions %>% as.data.frame %>% gather(variable, fraction_not_null) 
相關問題