Множественная агрегация в R

У меня есть три параметра (3 столбца)

x <- c(1, 1, 2, 2, 2, 2, 1, 1, 2) 
y <- c(1, 1, 1, 2, 2, 2, 3, 3, 3) 

а также

 z <- c(10, NA, 16, 25, 41, NA, 17, 53, 26)

Мне нужно для каждого y рассчитать среднее значение столбца z, где x==1

Как я могу сделать это с помощью aggregate функция в R?

data <- data.frame(x=c(1, 1, 2, 2, 2, 2, 1, 1, 2), 
                   y=c(1, 1, 1, 2, 2, 2, 3, 3, 3), 
                   z=c(10, NA, 16, 25, 41, NA, 17, 53, 26))

data
  x y  z
1 1 1 10
2 1 1 NA
3 2 1 16
4 2 2 25
5 2 2 41
6 2 2 NA
7 1 3 17
8 1 3 53
9 2 3 26

2 ответа

Вот один из способов сделать это, используя tapply:

with(data, tapply(z, list(x==1, y), mean, na.rm=TRUE)['TRUE', ])

#  1  2  3 
# 10 NA 35

В более общем смысле, применить произвольную функцию к группам, где x==1, и вернуться NA для групп, у которых нет x==1, мы можем использовать aggregate а также merge:

merge(aggregate(z~y, data[data$x==1,], function(x) {
 c(mean=mean(x, na.rm=TRUE), quantile(x, na.rm=TRUE))
}), list(y=unique(data$y)), all=TRUE)

#   y z.mean z.0% z.25% z.50% z.75% z.100%
# 1 1     10   10    10    10    10     10
# 2 2     NA   NA    NA    NA    NA     NA
# 3 3     35   17    26    35    44     53

Вот еще один лайнер с заполнителем для гольфа.

aggregate(z~y, within(data, z <- ifelse(x==1,z,NA)), mean, na.rm=TRUE, na.action=na.pass)

Это неоптимально, и оно возвращает NaN вместо NA для y==2, как это и есть (numeric(0)).

Другие вопросы по тегам