Подмножество R-кадров данных приводит к таинственным строкам NA
Я столкнулся с тем, что, по моему мнению, является ошибкой. Это неважно, но мне любопытно, видел ли кто-нибудь еще это. К сожалению, мои данные конфиденциальны, поэтому я должен составить пример, и это не будет очень полезно.
Когда подмножество моих данных, я иногда получаю таинственные строки NA, которые не находятся в моем исходном фрейме данных. Даже имена розеток - NA. EG:
example <- data.frame("var1"=c("A", "B", "A"), "var2"=c("X", "Y", "Z"))
example
var1 var2
1 A X
2 B Y
3 A Z
тогда я запускаю:
example[example$var1=="A",]
var1 var2
1 A X
3 A Z
NA<NA> <NA>
Конечно, приведенный выше пример действительно не дает вам эту загадочную строку NA; Я добавляю его здесь, чтобы проиллюстрировать проблему с моими данными.
Возможно, это связано с тем фактом, что я импортирую свой исходный набор данных с помощью Google read.xlsx package, а затем выполняю широкоформатную переформатировку перед подмножеством.
Спасибо
Ответы
Ответ 1
Заверните условие, в which
:
df[which(df$number1 < df$number2), ]
Как это устроено:
Он возвращает номера строк, где условие соответствует (где условие TRUE
), и соответственно устанавливает подкадр данных в этих строках.
Скажи это:
which(df$number1 < df$number2)
возвращает номера строк 1
, 2
, 3
, 4
и 5
.
Как таковой, написание:
df[which(df$number1 < df$number2), ]
так же, как писать:
df[c(1, 2, 3, 4, 5), ]
Или еще более простая версия:
df[1:5, ]
Ответ 2
Я вижу, на это уже ответил OP, но так как его комментарий похоронен глубоко в разделе комментариев, вот моя попытка исправить эту проблему (по крайней мере, с моими данными, которые ведут себя одинаково).
Прежде всего, некоторые примеры данных:
> df <- data.frame(name = LETTERS[1:10], number1 = 1:10, number2 = c(10:3, NA, NA))
> df
name number1 number2
1 A 1 10
2 B 2 9
3 C 3 8
4 D 4 7
5 E 5 6
6 F 6 5
7 G 7 4
8 H 8 3
9 I 9 NA
10 J 10 NA
Теперь для простого фильтра:
> df[df$number1 < df$number2, ]
name number1 number2
1 A 1 10
2 B 2 9
3 C 3 8
4 D 4 7
5 E 5 6
NA <NA> NA NA
NA.1 <NA> NA NA
Проблема заключается в том, что наличие NA
в третьем столбце заставляет R переписать всю строку как NA
. Тем не менее, размеры кадра данных поддерживаются. Здесь мое исправление, которое требует знания того, в каком столбце содержится NA
s:
> df[df$number1 < df$number2 & !is.na(df$number2), ]
name number1 number2
1 A 1 10
2 B 2 9
3 C 3 8
4 D 4 7
5 E 5 6
Ответ 3
У меня такая же проблема при использовании кода, аналогичного тому, что вы опубликовали. Используя подмножество функций()
subset(example,example$var1=="A")
вместо этого исключается строка NA.
Ответ 4
Использование dplyr:
library(dplyr)
filter(df, number1 < number2)
Ответ 5
> example <- data.frame("var1"=c("A", NA, "A"), "var2"=c("X", "Y", "Z"))
> example
var1 var2
1 A X
2 <NA> Y
3 A Z
> example[example$var1=="A",]
var1 var2
1 A X
NA <NA> <NA>
3 A Z
Возможно, это должен быть ваш результат, которого вы ожидаете... Попробуйте это
попробуйте использовать какое условие перед условием, чтобы избежать NA
example[which(example$var1=="A"),]
var1 var2
1 A X
3 A Z
Ответ 6
Другая причина может заключаться в том, что вы ошибаетесь, например, проверяете, равен ли фактор-столбец значение, которое не относится к его уровням. Меня беспокоило какое-то время.
Ответ 7
Я только что столкнулся с той же проблемой, и многие люди уже ответили за нее, поэтому я все вместе пишу здесь все решения, которые отлично спомогли мне:
- df [df $ colname == 0 &! is.na(df $ colname),]
- подмножество (DF, DF $ ColName == 0)
- df%>% filter (df $ colname == 0) # Для этого вам нужно установить библиотеку "dplyr"
Операция, которую я выполнял, требовала сравнения значения с 0, вы могли столкнуться с любой другой операцией, чтобы вы могли изменить запрос в соответствии с необходимостью.