2015-06-18 49 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