by
работает с data.frame, который разделен на mtcars$am
, поэтому ваша функция должна работать с data.frame вместо вектора, поэтому в примере ниже я использую sapply для go через каждый столбец и вычислите среднее значение и сд:
by(mtcars[vars],mtcars$am, FUN = function(u)sapply(u,dstats))
mtcars$am: 0
mpg hp wt
mean 17.147368 160.2632 3.7688947
sd 3.833966 53.9082 0.7774001
------------------------------------------------------------
mtcars$am: 1
mpg hp wt
mean 24.392308 126.84615 2.4110000
sd 6.166504 84.06232 0.6169816
Не так просто вернуть тот же формат, что и ваш вывод для агрегата, который является вложенным data.frame:
res = aggregate(mtcars[vars],by=list(am=mtcars$am), FUN = dstats)
class(res$hp)
[1] "matrix"
# to get mean hp for different groups, you have to do:
res$hp[,"mean"]
[1] 160.2632 126.8462
Чтобы получить нечто подобное с, это немного сложнее:
res = do.call(rbind,
by(mtcars[vars],mtcars$am,function(i){
unlist(lapply(i,dstats))
})
)
res = data.frame(am=levels(factor(mtcars$am)),res)
am mpg.mean mpg.sd hp.mean hp.sd wt.mean wt.sd
0 0 17.14737 3.833966 160.2632 53.90820 3.768895 0.7774001
1 1 24.39231 6.166504 126.8462 84.06232 2.411000 0.6169816