Агрегировать с na.действие=na.пас дает неожиданный ответ


Я использую следующие данные.фрейм в качестве примера:

d <- data.frame(x=c(1,NA), y=c(2,3))

Я хотел бы суммировать значения y по переменной x. поскольку общего значения x Нет, я ожидал бы, что агрегация просто даст мне исходные данные.кадр, где НС рассматривается как группа. Но агрегация дает мне следующие результаты.

>aggregate(y ~ x, data=d, FUN=sum)
  x y
1 1 2

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

>aggregate(y ~ x, data=d, FUN=sum, na.action=na.pass)
  x y
1 1 2

Что происходит дальше? Я, кажется, не понимаю, что происходит.пас делает в этом случае. Есть ли возможность выполнить то, что я хочу в R? Любая помощь будет очень признательна.

1 5

1 ответ:

aggregate использует tapply, который, в свою очередь, использует factor для своей переменной группировки.

Но посмотрите, что происходит со значениями NA в factor:
factor(c(1, 2, NA))
# [1] 1    2    <NA>
# Levels: 1 2

Обратите внимание на levels. Вы можете использовать addNA, чтобы сохранить NA:

addNA(factor(c(1, 2, NA)))
# [1] 1    2    <NA>
# Levels: 1 2 <NA>

Таким образом, вам, вероятно, нужно будет сделать что-то вроде:

aggregate(y ~ addNA(x), d, sum)
#   addNA(x) y
# 1        1 2
# 2     <NA> 3

Или что-то вроде:

d$x <- addNA(factor(d$x))
str(d)
# 'data.frame': 2 obs. of  2 variables:
#  $ x: Factor w/ 2 levels "1",NA: 1 2
#  $ y: num  2 3
aggregate(y ~ x, d, sum)
#      x y
# 1    1 2
# 2 <NA> 3

(в качестве альтернативы, сделайте обновление до чего-то вроде " data.таблица", которая будет не просто быстрее, чем aggregate, но которая это также даст вам более согласованное поведение со значениями NA. Нет необходимости обращать внимание на то, используете ли вы метод формулыaggregate или нет .)

library(data.table)
as.data.table(d)[, sum(y), by = x]
#     x V1
# 1:  1  2
# 2: NA  3