跨所有列交叉制表SparkR数据框中的缺失值

时间:2017-02-03 20:39:59

标签: r apache-spark na crosstab 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达到类似的灵活性。

1 个答案:

答案 0 :(得分:1)

每列NULL的计算分数:

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)