В чем разница между функциями 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.

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