2012-07-04 70 views
20

Tôi đang viết một hàm cần kiểm tra xem cột (và biến!) Có tất cả các giá trị bị thiếu (NA, <NA>) hay không. Sau đây là đoạn của hàm:Tìm các cột có tất cả các giá trị bị thiếu

test1 <- data.frame (matrix(c(1,2,3,NA,2,3,NA,NA,2), 3,3)) 
test2 <- data.frame (matrix(c(1,2,3,NA,NA,NA,NA,NA,2), 3,3)) 

na.test <- function (data) { 
    if (colSums(!is.na(data) == 0)){ 
     stop ("The some variable in the dataset has all missing value, 
    remove the column to proceed") 
     } 
     } 
na.test (test1) 

Warning message: 
In if (colSums(!is.na(data) == 0)) { : 
    the condition has length > 1 and only the first element will be used 

Q1: Tại sao là lỗi ở trên và bất kỳ sửa chữa?

Q2: Có cách nào để tìm cột nào có tất cả NA, ví dụ: xuất danh sách (tên biến hoặc số cột)?

+2

Tôi cảm thấy điều này phải được trả lời trước: một cái gì đó như 'tên (dữ liệu) [lapply (dữ liệu, hàm (x) tất cả (is.na (x)))] ' –

+2

Dấu ngoặc đơn của bạn sai. Viết 'colSums (! Is.na (dữ liệu)) == 0' thay cho' colSums (! Is.na (dữ liệu) == 0) '. – sgibb

Trả lời

27

Đây là đủ dễ dàng để có sapply và một chức năng ẩn danh nhỏ:

sapply(test1, function(x)all(is.na(x))) 
    X1 X2 X3 
FALSE FALSE FALSE 

sapply(test2, function(x)all(is.na(x))) 
    X1 X2 X3 
FALSE TRUE FALSE 

Và bên trong một hàm:

na.test <- function (x) { 
    w <- sapply(x, function(x)all(is.na(x))) 
    if (any(w)) { 
    stop(paste("All NA in columns", paste(which(w), collapse=", "))) 
    } 
} 

na.test(test1) 

na.test(test2) 
Error in na.test(test2) : All NA in columns 2 
+0

cảm ơn, tôi dự định ở đây để đặt như một phần của chức năng, do đó chức năng dừng nếu có bất kỳ TRUE ... đó là quan trọng đối với tôi khi tôi có số liệu lớn với> 50000 biến số – SHRram

+0

@ram Tôi đã chỉnh sửa câu trả lời của mình để bao gồm việc sử dụng bên trong một hàm – Andrie

+0

Bạn cũng có thể giảm số lượng tính toán bằng cách lưu ý rằng một cột bao gồm chỉ 'NA' sẽ là' lớp' 'lôgic'. Hơn nữa, nếu bạn không mong đợi bất kỳ cột logic nào khác thì điều này cung cấp cho bạn các cột NA. – James

5

Để tìm các cột với tất cả các giá trị thiếu

allmisscols <- apply(dataset,2, function(x)all(is.na(x))); 
colswithallmiss <-names(allmisscols[allmisscols>0]);  
print("the columns with all values missing");  
print(colswithallmiss); 
6

I n dplyr

ColNums_NotAllMissing <- function(df){ # helper function 
    as.vector(which(colSums(is.na(df)) != nrow(df))) 
} 

df %>% 
select(ColNums_NotAllMissing(.)) 

example: 
x <- data.frame(x = c(NA, NA, NA), y = c(1, 2, NA), z = c(5, 6, 7)) 

x %>% 
select(ColNums_NotAllMissing(.)) 

hoặc, cách khác xung quanh

Cols_AllMissing <- function(df){ # helper function 
    as.vector(which(colSums(is.na(df)) == nrow(df))) 
} 


x %>% 
    select(-Cols_AllMissing(.)) 
1

Để kiểm tra xem cột có tất cả các giá trị thiếu:

apply(test1,2,function(x) {all(is.na(x))}) 

Để có được cột có tất cả các giá trị thiếu:

test1.nona <- test1[ , colSums(is.na(test1)) == 0] 
0

Theo dõi Lệnh g cung cấp cho bạn một bảng đẹp với các cột có giá trị NA:

sapply(dataframe, function(x)all(any(is.na(x)))) 

Đó là một cải tiến cho câu trả lời đầu tiên mà bạn nhận được, không hoạt động chính xác trong một số trường hợp.