R 按比例将NAs随机插入数据帧
我有一个完整的数据框架。我想用NAs替换数据帧中20%的值,以模拟随机丢失的数据R 按比例将NAs随机插入数据帧,r,dataframe,na,missing-data,R,Dataframe,Na,Missing Data,我有一个完整的数据框架。我想用NAs替换数据帧中20%的值,以模拟随机丢失的数据 A <- c(1:10) B <- c(11:20) C <- c(21:30) df<- data.frame(A,B,C) Adf您可以取消列出data.frame,然后随机取样,然后放回data.frame df <- unlist(df) n <- length(df) * 0.15 df[sample(df, n)] <- NA as.data.frame(ma
A <- c(1:10)
B <- c(11:20)
C <- c(21:30)
df<- data.frame(A,B,C)
Adf您可以取消列出data.frame,然后随机取样,然后放回data.frame
df <- unlist(df)
n <- length(df) * 0.15
df[sample(df, n)] <- NA
as.data.frame(matrix(df, ncol=3))
df相同的结果,使用二项分布:
dd=dim(df)
nna=20/100 #overall
df1<-df
df1[matrix(rbinom(prod(dd), size=1,prob=nna)==1,nrow=dd[1])]<-NA
df1
dd=dim(df)
nna=20/100#总体
df1我是否可以建议使用第一个函数(ggNAadd)来实现这一点,并使用第二个函数来改进它,该函数提供所创建NAs(ggNA)的图形分布
整洁的是可以输入固定数量的NAs的一部分
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)
}
当然,如前所述,如果你问太多的NAs,实际百分比会因为重复而下降。如果你想使用purrr
而不是lappy
,你也可以这样做:
> library(purrr)
> df <- data.frame(A = 1:10, B = 11:20, C = 21:30)
> df
A B C
1 1 11 21
2 2 12 22
3 3 13 23
4 4 14 24
5 5 15 25
6 6 16 26
7 7 17 27
8 8 18 28
9 9 19 29
10 10 20 30
> map_df(df, function(x) {x[sample(c(TRUE, NA), prob = c(0.8, 0.2), size = length(x), replace = TRUE)]})
# A tibble: 10 x 3
A B C
<int> <int> <int>
1 1 11 21
2 2 12 22
3 NA 13 NA
4 4 14 NA
5 5 15 25
6 6 16 26
7 7 17 27
8 8 NA 28
9 9 19 29
10 10 20 30
>库(purrr)
>df-df
A、B、C
1 1 11 21
2 2 12 22
3 3 13 23
4 4 14 24
5 5 15 25
6 6 16 26
7 7 17 27
8 8 18 28
9 9 19 29
10 10 20 30
>map_df(df,函数(x){x[sample(c(TRUE,NA),prob=c(0.8,0.2),size=length(x),replace=TRUE)])
#一个tibble:10x3
A、B、C
1 1 11 21
2 2 12 22
3 NA 13 NA
4 14 NA
5 5 15 25
6 6 16 26
7 7 17 27
8 NA 28
9 9 19 29
10 10 20 30
Amutate\u all
方法:
df %>%
dplyr::mutate_all(~ifelse(sample(c(TRUE, FALSE), size = length(.), replace = TRUE, prob = c(0.8, 0.2)),
as.character(.), NA))
你是说每个变量的15%吗?或总体观察结果?20%是可以的(即,值的6%应为NA),您可能希望查看给出NA确切比例的答案:
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
## ..
> library(purrr)
> df <- data.frame(A = 1:10, B = 11:20, C = 21:30)
> df
A B C
1 1 11 21
2 2 12 22
3 3 13 23
4 4 14 24
5 5 15 25
6 6 16 26
7 7 17 27
8 8 18 28
9 9 19 29
10 10 20 30
> map_df(df, function(x) {x[sample(c(TRUE, NA), prob = c(0.8, 0.2), size = length(x), replace = TRUE)]})
# A tibble: 10 x 3
A B C
<int> <int> <int>
1 1 11 21
2 2 12 22
3 NA 13 NA
4 4 14 NA
5 5 15 25
6 6 16 26
7 7 17 27
8 8 NA 28
9 9 19 29
10 10 20 30
df %>%
dplyr::mutate_all(~ifelse(sample(c(TRUE, FALSE), size = length(.), replace = TRUE, prob = c(0.8, 0.2)),
as.character(.), NA))