2013-04-01 3 views

ответ

1

Вы можете использовать функцию «na.omit()» для удаления строк, содержащих наблюдения NA. Эта функция удаляет строки и возвращает кадр данных без NA.

Если вы хотите, чтобы удалить столбцы, где каждое наблюдение содержит Ч ...

Я не уверен, встроенную в R функции, чтобы сделать это. Тем не менее, мы можем рассматривать какой-то определенный процесс пользователя, который падает колонки с самым NA-х ...

### Assume 'df' is your data frame with observational data: 

### Apply a function to check whether each observation contains an NA 
count <- sapply(df, is.na) 
### Within each column, ask for the number of missing observations 
count <- colSums(count) 
### Ask R which columns have the most missing observations 
index <- which.max(count) 
### Subset 'df' to exclude columns with the most NA's 
df <- df[, -index] 
+0

Этот ответ представляется, что 'df' является' data.frame'. Речь идет о «матрице». Подход 'sapply' полезен для data.frames и списков, но не для матриц. – mnel

2

Я предполагаю, что вы только хотите, чтобы опустить столбцы, где все наблюдения NA; ваш вопрос несколько неоднозначен.

Этот код не включает столбцы, которые полностью NA, для матрицы, x, возвращая только те столбцы, по меньшей мере, одного не- NA значения:

x[,apply(!is.na(x),2,any)] 
+2

Будет немного более эффективно использовать память 'x [, apply (x, 2, function (xx)! Any (is.na (xx)))], так как это не создаст' is.na (x) ', просто вектор' length (ncol (x)) ' – mnel

+0

@mnel Да, если матрица большая, мой код выше будет неэффективным. –

1
mtx[ , -which(colSums(is.na(mtx)) == nrow(mtx)) ] 

Если вы хотели, чтобы исключить столбцы, было зарегистрировано более 50% записей NA:

mtx[ , -which(colSums(is.na(mtx)) > nrow(mtx)/2) ] 
Смежные вопросы