Агрегировать с 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