跨所有列对 Spark 数据框中的缺失值进行交叉制表
Cross tabulating missing values in SparkR data frame across all columns
我对 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)))
})
我喜欢 table
和 prop.table
提供的灵活性,理想情况下我希望能够通过 SparkR 获得类似的灵活性。
计算每列 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)
我对 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)))
})
我喜欢 table
和 prop.table
提供的灵活性,理想情况下我希望能够通过 SparkR 获得类似的灵活性。
计算每列 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)