赫赫,谢谢交流。你是从为什么mytable的Freq列是一个factor的角度来分析这个结果,并提到了关于Matrix的一个知识细节,很好!关于factor和matrix的两个知识细节以及编写自定义函数时对自变量类型需要特别关注,在这里都体现了。
通过该例子尤其启发我们:做自定义函数时,要提前想清楚该函数的自变量类型,对于不同类型自变量,处理方式是不同的。自定义函数的代码尽量要有扩展性和通用性,能对自变量是matrix和dataframe以及其它类型都能正确处理。
再举个例子,还是这本书,在代码清单7-7中:
dstats<-function(x) (c(mean=mean(x),sd=sd(x)))
by(mtcars[vars],mtcars$am,dstats)
以上代码运行时会提示错误,稍微分析看出:dstats的自变量是类型为dataframe的mtcars[vars],而mean函数和sd函数自变量不能是dataframe类型:
> str(mtcars[vars])'data.frame': 32 obs. of 3 variables: $ mpg: num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ... $ hp : num 110 110 93 110 175 105 245 62 95 123 ... $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
解决办法:修改自定义函数dstats如下,可以得到正确结果。
> dstats<-function(x)(c(mean=apply(x,2,mean),sd=apply(x,2,sd)))> by(mtcars[vars],mtcars$am,dstats)mtcars$am: 0 mean.mpg mean.hp mean.wt sd.mpg sd.hp sd.wt 17.1473684 160.2631579 3.7688947 3.8339664 53.9081957 0.7774001 ------------------------------------------------------- mtcars$am: 1 mean.mpg mean.hp mean.wt sd.mpg sd.hp sd.wt 24.3923077 126.8461538 2.4110000 6.1665038 84.0623243 0.6169816 |
|
|