Агрегировать с 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 ответ:
Но посмотрите, что происходит со значениями
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