Фильтрация данных в R

У меня есть CSV файла данных, который я могу загрузить в R с помощью read.csv()

Некоторые из данных отсутствуют, поэтому я хочу уменьшить фрейм данных до установки, который целиком состоит из не пропущенных данных, т.е. если a NULL появляется где угодно, я хочу исключить этот столбец и строку из отфильтрованного набор данных.

Я знаю, что, возможно, достаточно просто сделать это с помощью встроенных векторных операций R, но я не совсем уверен, как это сделать?

Чтобы сделать мой вопрос немного более конкретным, вот краткий образец данных, чтобы вы могли видеть, что я хочу делать.

DocID       Anno1    Anno7  Anno8
1           7        NULL   8
2           8        NULL   3
44          10       2      3
45          6        6      6
46          1        3      4
49          3        8      5
62          4        NULL   9
63          2        NULL   4
67          11       NULL   3
91          NULL     9      7
92          NULL     7      5
93          NULL     8      8

Поэтому, учитывая этот ввод, мне нужен код, который уменьшит вывод к этому.

DocID       Anno8
44          3
45          6
46          4
49          5

Поскольку Anno8 - единственный столбец с данными, отличными от NULL, и есть только четыре строки с не-NULL-данными.

Ответ 1

Если x является вашим data.frame (или matrix), то

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

Так как ваш пример использует NULL, is.na(·) будет заменен на is.null(·)

В качестве альтернативы вы можете посмотреть subset(·).

Ответ 2

Вы можете удалить любую строку, содержащую отсутствующую с помощью na.omit(), однако это не то, что вы хотите. Более того, принятый в настоящее время ответ неверен. Он дает вам полные столбцы, но не оставляет строки с одним или несколькими отсутствующими значениями, что и требовалось. Правильный ответ может быть получен как:

> a <- data.frame(a=c(1,2),b=c(NA,1), c=c(3,4))
> a
  a  b c
1 1 NA 3
2 2  1 4
> na.omit(a)[,colSums(is.na(a))==0]
  a c
2 2 4

Чтобы увидеть, что приведенный выше ответ неверен:

> a[ ,apply(a, 2, function(z) !any(is.na(z)))]
  a c
1 1 3
2 2 4

Строка 1 должна быть сброшена из-за NA в столбце 2.

Ответ 3

a <- data.frame(a=c(1,2,0,1),b=c(NA,1,NA,1), c=c(3,4,5,1))

na.omit(a)
  a b c
2 2 1 4
4 1 1 1

a[rowSums(is.na(a))==0,]
  a b c
2 2 1 4
4 1 1 1

a[complete.cases(a),]
  a b c
2 2 1 4
4 1 1 1

Ответ 4

Кроме того, вы можете сделать это, используя библиотеку sqldf, если x является вашим фреймом данных:

library(sqldf)
result <- sqldf("SELECT DocID, Anno8 FROM x
                 WHERE Anno1 IS NOT NULL AND Anno7 IS NOT NULL")