R 按比例将NAs随机插入数据帧

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

我有一个完整的数据框架。我想用NAs替换数据帧中20%的值,以模拟随机丢失的数据

A <- c(1:10)
B <- c(11:20)
C <- c(21:30)
df<- data.frame(A,B,C)

A
df您可以取消列出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

A
mutate\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))