Множественная агрегация в 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)).