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
## ..
7条答案
按热度按时间ttygqcqt1#
这是一个随机过程,所以它可能不会每次都给予15%。
y3bcpkx12#
您可以取消列出data.frame,然后随机取样,然后放回data.frame中。
可以使用sample()以多种不同的方式完成。
hs1rzwqc3#
如果你想使用
purrr
而不是lapply
,你也可以这样做:bis0qfac4#
我建议使用第一个函数(ggNAadd)来实现这一点,并使用第二个函数(ggNA)来改进它,该函数提供所创建的NA的图形分布
什么是整洁的是输入固定数量的NA的比例的可能性。
以及绘图功能:
这给出(使用ggplot2作为图形输出):
当然,如前所述,如果你问太多的NA,实际的百分比会因为重复而下降。
iovurdzv5#
使用二项分布的结果相同:
vfwfrxfs6#
mutate_all
方法:z3yyvxxp7#
还有
collapse::na_insert
,它是在列上矢量化的,而且非常快:基准: