2015-08-06 2 views
11

Я хочу удалить все столбцы или строки с более чем 50% NA s в фрейме данных.Удалить столбцы/строки с большим количеством x% отсутствующих

Это мое решение:

# delete columns with more than 50% missings 
miss <- c() 
for(i in 1:ncol(data)) { 
    if(length(which(is.na(data[,i]))) > 0.5*nrow(data)) miss <- append(miss,i) 
} 
data2 <- data[,-miss] 


# delete rows with more than 50% percent missing 
miss2 <- c() 
for(i in 1:nrow(data)) { 
    if(length(which(is.na(data[i,]))) > 0.5*ncol(data)) miss2 <- append(miss2,i) 
} 
data <- data[-miss,] 

, но я ищу красивее/быстрее решения.

Я хотел бы также оценить dplyr решение

+0

@ Ricky Я добавил решение для ряда строк, которое почти такое же. – spore234

+0

Чтобы подтвердить мое понимание дополнительного решения строки: Так что если строка X изначально имеет более 50% NA, но после удаления столбца 3, чем столбец X, менее 50% NA, строка X не должна удаляться? – Ricky

ответ

20

Чтобы удалить столбцы с некоторым количеством NA, вы можете использовать colMeans(is.na(...))

## Some sample data 
set.seed(0) 
dat <- matrix(1:100, 10, 10) 
dat[sample(1:100, 50)] <- NA 
dat <- data.frame(dat) 

## Remove columns with more than 50% NA 
dat[, -which(colMeans(is.na(dat)) > 0.5)] 

и аналогично для строк, используя rowMeans.

+0

, так что это 'dat [-which (rowMeans (is.na (dat))> 0.5),]' для строк. благодаря! – spore234

+1

@ spore234 HTH @PierreLafortune после быстрого теста, похоже, примерно в 3 раза быстрее, чем эквивалентное решение 'sapply' – jenesaisquoi

Смежные вопросы