Подмножество 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

Я только что столкнулся с той же проблемой, и многие люди уже ответили за нее, поэтому я все вместе пишу здесь все решения, которые отлично спомогли мне:

  1. df [df $ colname == 0 &! is.na(df $ colname),]
  2. подмножество (DF, DF $ ColName == 0)
  3. df%>% filter (df $ colname == 0) # Для этого вам нужно установить библиотеку "dplyr"

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