2015-06-18 81 views
0

产生在一个数据帧随机缺失值我有一个数据帧的一个简单的例子,如下所示:,使用R

a b c 

10 50 100 

45 36 27 

15 80 90 

预期为如下所示的输出。

a b c 

10 NA 100 

NA NA NA 

15 80 27 

,我试图如下编程:

insert_nas <- function(x) { 

    len <- length(x) 

    n <- sample(1:floor((0.01*(dim(x)[1]))), 1) 

    i <- sample(1:len, n) 

    x[i] <- NA 

    x 

} 


> sapply(incomplete.data,insert_nas) 

Error in 1:floor((0.01 * (dim(x)[1]))) : argument of length 0 

然而,有一个错误出现了。
如何在数据框中丢失1%的随机缺失值?

+0

感谢克里斯编辑的程序代码。 –

+0

另请参阅此图形代表:http://stackoverflow.com/a/28368161/3871924 – agenis

回答

1

当你的错误来源于:

sapply呼叫尝试功能insert_nas适用于incomplete.data每个元素(在这种情况下,一个数据帧中的元素是其列)。应用于原子向量的函数dim产生NULL;乘以常数给出长度为0的数字向量;应用floor不会改变这一点;最后试图生成一个由空向量限定的序列给出了一个错误。

如何消除错误:

大概是由dim(x)[1]你打算让行的数据帧的数量(这是你当x是数据帧,而不是其列之一)。尝试用length(x)替换它。

对于NAS的任意分布的选择:

要改变值NA的一些比例p,不考虑列位置分配,似乎最直接只使用适当大小的随机样本(对* DF-大小)在整个数据框选择元素设置为NA:

sel <- sample(nrow(df)*ncol(df), size = p*nrow(df)*ncol(df)) 
for(t in 1:length(sel)){ 
    is.na(df[[sel[t]%/%nrow(df) +1]]) <- sel[t]%%nrow(df) + 1 
} 
+0

感谢您的帮助tegancp我真的很感激它。但是,对于数据框中的每个列缺少1%的随机缺失值,但我依然无法找到在数据框中的所有列中缺失总数1%的方法。 –

+0

那么你是在寻找随机选择的1%NAs,随机分布而不考虑列(所以不同的列将有不同比例的NAs)? – tegancp

+0

对不起,回复晚了tegancp。是的,tegancp如何通过这样生成随机缺失值? –

0

我从missForest包使用的prodNA

我的功能是遵循

fn.df.add.NA <- function(df, var.name, prop.of.missing) { 
    df.buf <- subset(df, select=c(var.name))      # Select variable 
    require(missForest, quietly = T) 
    df.buf <- prodNA(x = df.buf, prop.of.missing)     # chage original value to NA in casual sequence 
    detach("package:missForest", unload=TRUE) 

    df.col.order <- colnames(x = df)        # save the column order  
    df <- subset(df, select=-c(which(colnames(df)==var.name))) # drop the variable with no NAs  
    df <- cbind(df, df.buf)          # add the column with NA   
    df <- subset(df, select=df.col.order)       # restore the original order sequence 

    return(df) 
} 

它允许根据给定的比例改变到NAS观察的随机数。

因为prodNA函数将NA应用于所有data.frame列我已经使用“缓冲区”数据结构以便返回输入data.frame的相同数据结构。也许一些读者可能会建议一个更优雅的方式。

在每一个方式,你可以做这个测试

set.seed(1) 
df <- data.frame(a = as.numeric(runif(n = 100, min = 1, max = 100)), 
       b = as.numeric(runif(n = 100, min = 201, max = 300)), 
       c = as.numeric(runif(n = 100, min = 301, max = 400))) 

summary(df) 
     a    b    c   
Min. : 2.326 Min. :202.3 Min. :303.8 
1st Qu.:32.985 1st Qu.:229.2 1st Qu.:319.8 
Median :49.293 Median :252.3 Median :338.4 
Mean :52.267 Mean :252.2 Mean :344.1 
3rd Qu.:76.952 3rd Qu.:273.3 3rd Qu.:364.0 
Max. :99.199 Max. :299.3 Max. :398.2 

df <- fn.df.add.NA(df = df, var.name = "a", prop.of.missing = .1) 
df <- fn.df.add.NA(df = df, var.name = "b", prop.of.missing = .2) 
df <- fn.df.add.NA(df = df, var.name = "c", prop.of.missing = .3) 

summary(df) 
     a    b    c   
Min. : 2.326 Min. :202.3 Min. :303.8 
1st Qu.:30.628 1st Qu.:229.2 1st Qu.:319.2 
Median :48.202 Median :252.3 Median :342.2 
Mean :50.247 Mean :252.5 Mean :345.4 
3rd Qu.:71.504 3rd Qu.:273.3 3rd Qu.:369.3 
Max. :99.199 Max. :299.3 Max. :396.2 
NA's :10  NA's :20  NA's :30