Использование na.rm=True и na.action=na.pass в агрегате () — разница?

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

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

Итак, у меня есть набор данных с несколькими NA.

Я хочу агрегировать данные и использовать na.rm=True, который говорит R игнорировать NA при расчете, верно? Вывод, который я получил, включал NA, и это привело к тому, что я использовал функцию na.action=na.pass вместе с na.rm=True. Это оставило у меня значительно меньше NA в моем выводе. Честно говоря, я не понимаю, почему...

Поскольку мне нравится пробовать и выяснять для себя, я рассмотрел различные варианты моей агрегатной функции:

  1. только с na.rm=True
  2. только с na.action=na.pass
  3. na.rm=True, na.action=na.pass

только используя 2. Я получаю много NA, что имеет смысл, потому что я сказал R включить все NA в расчет, не имея в нем na.rm=True. В то же время 1. и 3. не дают мне одинаковых результатов. это почему?

Я думал, что два na.rm=True и na.action=na.pass означают одно и то же... видимо, это не так, потому что я получаю немного разные значения для своих переменных.

Что происходит с моими данными, когда я использую и na.rm=True, и na.action=na.pass в агрегатной функции по сравнению с использованием только na.rm=True. Что лучше использовать?

Большое спасибо, я ценю вашу помощь!


person Arya    schedule 17.03.2021    source источник
comment
У вас есть примеры данных, которыми вы можете поделиться?   -  person Ronak Shah    schedule 17.03.2021
comment
@ Ронак Шах К сожалению, я не могу поделиться данными, потому что это конфиденциально ... Мне просто нужно знать, какая разница при использовании ‹na.rm=T, na.action=na.pass› по сравнению с просто ‹na.rm= T› с агрегатной функцией... но уже спасибо за помощь :)   -  person Arya    schedule 17.03.2021


Ответы (1)


Давайте возьмем простой пример, чтобы понять это:

df <- data.frame(a = c(2, 2, 1, 3, NA, NA), b = c(1, 1, 1, 2, 2, 3))
df
#   a b
#1  2 1
#2  2 1
#3  1 1
#4  3 2
#5 NA 2
#6 NA 3
  • Использование aggregate с sum.
aggregate(a~b, df, sum)

#  b a
#1 1 5
#2 2 3

Обратите внимание, что в выводе нет строки b = 3. Также b = 2 имеет 1 значение NA, но мы вернули результат 3 без добавления na.rm = TRUE. Это означает, что по умолчанию все значения NA отбрасываются при расчете.

  • С na.action = 'na.pass'.
aggregate(a~b, df, sum, na.action = 'na.pass')

#  b  a
#1 1  5
#2 2 NA
#3 3 NA

Указав na.action = na.pass, мы просим его включить все значения NA. Следовательно, теперь у нас есть строка для b = 3, а b = 2 — это NA, так как мы не включили na.rm = TRUE.

  • Использование na.rm = TRUE.
aggregate(a~b, df, sum, na.rm = TRUE, na.action = 'na.pass')

#  b a
#1 1 5
#2 2 3
#3 3 0

Я думаю, что вывод этого должен быть очевиден.

person Ronak Shah    schedule 18.03.2021