Вопрос
У меня есть 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")