2014-09-22 56 views
2

假設我有數據幀:如何找到相應的類,其預測值缺失中的R

> df 
     a b c d e 
1 class 1 NA NA M NA 
2 class 2 0.60 3 F 12 
3 class 3 0.40 4 <NA> 14 
4 class 1 NA 5 F 67 
5 class 1 NA NA <NA> 12 
6 class 2 1.00 NA F 22 
7 class 1 0.45 6 M NA 
8 class 1 1.20 7 <NA> NA 
9 class 2 NA NA M 34 
10 class 2 1.30 1 <NA> 23 
11 class 3 1.20 1 M 35 
12 class 3 0.22 NA F NA 

我想找到類的對應於缺少值: 例如

對應於1類:10個值丟失

對應於2類:4值丟失

等 上。在實際的數據我有一類變量和35個預測

我用:

>complete.cases(df) 

這工作,但我想在數字更詳細的輸出。因爲我正在處理的實際數據非常大。

請幫幫我。

謝謝

回答

2

一個非常快速的解決方案(專爲大數據集設計),可以使用data.table

library(data.table) 
setDT(df)[, list(SumNAs = sum(is.na(.SD))), by = a] 

#   a SumNAs 
# 1: class 1  10 
# 2: class 2  4 
# 3: class 3  3 

或與基地R

df2 <- data.frame(a = df[, 1], freq = rowSums(is.na(df[, -1]))) 
with(df2, tapply(freq, a, sum)) 
## class 1 class 2 class 3 
##  10  4  3 

編輯 這裏有一些基準,再大數據具有很多列

set.seed(123) 
n <- 1e5 
df <- data.frame(a = sample(c("class 1", "class 2", "class 3"), n, replace = TRUE), 
       b = sample(c(1:6, NA), n, replace = TRUE), 
       c = sample(c(1:6, NA), n, replace = TRUE), 
       d = sample(c(1:6, NA), n, replace = TRUE), 
       e = sample(c(1:6, NA), n, replace = TRUE), 
       f = sample(c(1:6, NA), n, replace = TRUE), 
       j = sample(c(1:6, NA), n, replace = TRUE), 
       h = sample(c(1:6, NA), n, replace = TRUE), 
       i = sample(c(1:6, NA), n, replace = TRUE), 
       k = sample(c(1:6, NA), n, replace = TRUE), 
       l = sample(c(1:6, NA), n, replace = TRUE), 
       m = sample(c(1:6, NA), n, replace = TRUE), 
       n = sample(c(1:6, NA), n, replace = TRUE)) 
library(microbenchmark) 
df2 <- copy(df) 

davidDT <- function(x) setDT(x)[, list(SumNAs = sum(is.na(.SD))), by = a] 

davidBaseR <- function(x){ 
    df2 <- data.frame(a = x[, 1], freq = rowSums(is.na(x[, -1]))) 
    with(df2, tapply(freq, a, sum)) 
} 

RichardBaseR <- function(x){ 
    cb <- cbind(x[1], isNA = rowSums(is.na(x[-1]))) 
    aggregate(isNA ~ a, cb, sum) 
} 

microbenchmark(davidDT(df2), 
       davidBaseR(df), 
       RichardBaseR(df), 
       times = 100L) 

# Unit: milliseconds 
#    expr  min   lq  median   uq  max neval 
#  davidDT(df2) 34.25858 36.91607 39.19706 41.18780 113.0531 100 
# davidBaseR(df) 32.75058 36.46721 43.01609 47.66303 199.7966 100 
# RichardBaseR(df) 1429.29449 1469.32023 1521.38640 1631.51353 2525.2406 100 
+0

謝謝大衛:) – Learner27 2014-09-22 21:53:33

+0

@大衛,有趣的基準,但這裏的「data.table」優勢在哪裏呢? :-) – A5C1D2H2I1M1N2O1R2T1 2014-09-23 03:42:54

+0

(實際上,我的系統基準測試顯示「數據」的相對性能更好。表「比從你的基準測試結果中顯而易見 - 大約是davidBaseR的兩倍,所以我很好奇。) – A5C1D2H2I1M1N2O1R2T1 2014-09-23 03:50:12

3

第一部分,你的原始數據,原貼:

如何否定完整的情況下,然後從輸出構建表。

> (x <- df[!complete.cases(df),]) 
#   a b 
# 1 class 1 NA 
# 4 class 1 NA 
# 5 class 1 NA 
# 9 class 2 NA 
> table(x, useNA = "ifany") 
#   b 
# a   <NA> 
# class 1 3 
# class 2 1 
# class 3 0 

第二部分,更新後的數據,後期編輯:

> cb <- cbind(df[1], isNA = rowSums(is.na(df[-1]))) 
> aggregate(isNA ~ a, cb, sum) 
#   a isNA 
# 1 class 1 10 
# 2 class 2 4 
# 3 class 3 3 
+0

感謝理查德設置爲每OP的評論。它的工作,但對於更大的數據其顯示以下錯誤:錯誤在表(x,useNA =「ifany」)中: 試圖製作一個表格,其中> = 2^31個元素....我的數據中有36個變量 – Learner27 2014-09-22 20:56:06

+0

@ user3718501,請提供一個示例,說明您希望得到的結果將看起來像讓我們說,5列數據集 – 2014-09-22 21:01:26

+0

謝謝我編輯了這個問題。我希望這可以幫助 – Learner27 2014-09-22 21:13:29