В чем разница между функциями tapply и ave?
Я не могу сосредоточиться на ave
функция. Я прочитал помощь и искал в сети, но я все еще не могу понять, что он делает. Я понимаю, что некоторые функции применяются к подмножеству наблюдений, но не так, как, например, tapply
Может ли кто-нибудь, пожалуйста, просветить меня, возможно, с небольшим примером?
Спасибо, и извините за возможно необычную просьбу.
1 ответ
tapply
возвращает один результат для каждого факторного уровня. ave
также выдает один результат на уровень фактора, но копирует это значение в каждую позицию в исходных данных.
ave
удобен для создания нового столбца во фрейме данных со сводными данными.
Краткий пример:
tapply(iris$Sepal.Length, iris$Species, FUN=mean)
setosa versicolor virginica
5.006 5.936 6.588
Одно значение, среднее для каждого факторного уровня.
ave
на iris
производит 150 результатов, которые соответствуют исходному фрейму данных:
ave(iris$Sepal.Length, iris$Species, FUN=mean)
[1] 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006
[17] 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006
[33] 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006 5.006
[49] 5.006 5.006 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936
[65] 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936
[81] 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936 5.936
[97] 5.936 5.936 5.936 5.936 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588
[113] 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588
[129] 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588 6.588
[145] 6.588 6.588 6.588 6.588 6.588 6.588
Как отмечено в комментариях, здесь одно значение перерабатывается для заполнения каждого местоположения в исходных данных.
Если функция возвращает несколько значений, они при необходимости возвращаются для заполнения мест. Например:
d <- data.frame(a=rep(1:2, each=5), b=1:10)
ave(d$b, d$a, FUN=rev)
[1] 5 4 3 2 1 10 9 8 7 6
Спасибо Джошу и thelatemail.