Re: [问题] iris不同品种所占比例的圆饼图

楼主: swedrf0112 (M)   2015-06-16 19:17:25
※ 引述《yeuan (心要够坚定)》之铭言:
: [问题类型]:
: 分类后计算比例绘制圆饼图
: [软件熟悉度]:
: 新手(没写过程式,R 是我的第一次)
: [问题叙述]:
: 想计算iris三种品种的Sepal.Length各占多少比例 并制作圆饼图
: 因为知道的指令有限 一时想不出更好的 只有土法炼钢的作法
: 想请教有没有更简洁的写法
: [程式范例]:
: X=iris[,c(1,5)]
: A=subset(X,Species=="setosa")
: B=subset(X,Species=="versicolor")
: C=subset(X,Species=="virginica")
: a=sum(A$Sepal.Length)/sum(X$Sepal.Length)
: b=sum(B$Sepal.Length)/sum(X$Sepal.Length)
: c=sum(C$Sepal.Length)/sum(X$Sepal.Length)
: y=c(a,b,c)
: pie(y,label=c("setosa","versicolor","virginica"),density=100,col=2:4)
只要满足下列3个条件,你可以使用tapply函数来作
1. 要处理某一条资料向量 ( iris$Sepal.Length )
2. 这条资料向量有对应的factor ( iris$Species )
3. 需要by factor进行函数处理 ( sum, mean, sd ... )
因此,若想依照iris$Species进行分组加总,可以写成以下这样 :
> SumByFactor=tapply(X=iris$Sepal.Length,INDEX=iris$Species,FUN=sum)
> SumByFactor
setosa versicolor virginica
250.3 296.8 329.4
再将 SumByFactor 除上 sum(iris$Sepal.Length) 即可得y
> y=SumByFactor/sum(iris$Sepal.Length)
> y
setosa versicolor virginica
0.2855676 0.3386195 0.3758129
另外apply类的函数,在后面的FUN都可以接自己定义的函数,例如以下进阶版 :
> y=tapply(X=iris$Sepal.Length,INDEX=iris$Species,FUN=function(z){
+
+ sum(z) / sum(iris$Sepal.Length)
+ })
> y
setosa versicolor virginica
0.2855676 0.3386195 0.3758129
值得注意的是,要想清楚会传进去计算的z是什么东西,
在这边,传进去当z的是你文章内的
A$Sepal.Length , B$Sepal.Length , C$Sepal.Length
这三条向量会各自传进去进行运算,
所以回传就会是这3个向量各自加总后除以sum(iris$Sepal.Length)的值。
apply类的函数都可以使用类似的模式思考,加油!
作者: yeuan (心要够坚定)   2015-06-18 06:45:00
很清楚 谢谢!

Links booklink

Contact Us: admin [ a t ] ucptt.com