Может ли я предложить первую функцию (ggNAadd) разработано, чтобы сделать это, и улучшить его с второй функцией обеспечения графического распределения САМОГО созданным (ggNA)
Что является опрятным, это возможность вводить либо долю фиксированного числа НС.
ggNAadd = function(data, amount, plot=F){
temp <- data
amount2 <- ifelse(amount<1, round(prod(dim(data))*amount), amount)
if (amount2 >= prod(dim(data))) stop("exceeded data size")
for (i in 1:amount2) temp[sample.int(nrow(temp), 1), sample.int(ncol(temp), 1)] <- NA
if (plot) print(ggNA(temp))
return(temp)
}
И функция зарисовки:
ggNA = function(data, alpha=0.5){
require(ggplot2)
DF <- data
if (!is.matrix(data)) DF <- as.matrix(DF)
to.plot <- cbind.data.frame('y'=rep(1:nrow(DF), each=ncol(DF)),
'x'=as.logical(t(is.na(DF)))*rep(1:ncol(DF), nrow(DF)))
size <- 20/log(prod(dim(DF))) # size of point depend on size of table
g <- ggplot(data=to.plot) + aes(x,y) +
geom_point(size=size, color="red", alpha=alpha) +
scale_y_reverse() + xlim(1,ncol(DF)) +
ggtitle("location of NAs in the data frame") +
xlab("columns") + ylab("lines")
pc <- round(sum(is.na(DF))/prod(dim(DF))*100, 2) # % NA
print(paste("percentage of NA data: ", pc))
return(g)
}
Что дает (с использованием ggplot2 в качестве графического вывода):
ggNAadd(df, amount=0.20, plot=TRUE)
## [1] "percentage of NA data: 20"
## A B c
## 1 1 11 21
## 2 2 12 22
## 3 3 13 23
## 4 4 NA 24
## ..
Конечно, как уже упоминалось ранее, если вы спросите слишком много NAs, фактический процент упадет из-за повторений.
Вы имеете в виду 15% от каждой переменной? или общие наблюдения? – Robert
20% в порядке (то есть 6 значений должно быть NA) – Filly
Возможно, вы захотите проверить этот ответ, который дает точные пропорции NA: https://stackoverflow.com/q/39513837/3871924 – agenis