Вопрос

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

Некоторые данные отсутствуют, поэтому я хочу уменьшить фрейм данных до набора, который целиком состоит из не пропущенных данных, т. е. если где-то появляется 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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

Вы можете удалить любую строку, содержащую пропущенный элемент, с помощью 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.

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

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

library(sqldf)
result <- sqldf("SELECT DocID, Anno8 FROM x
                 WHERE Anno1 IS NOT NULL AND Anno7 IS NOT NULL")
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top