Фильтрация данных в 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")