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