Re: [問題] iris不同品種所占比例的圓餅圖

看板R_Language作者 (M)時間9年前 (2015/06/16 19:17), 9年前編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/3 (看更多)
※ 引述《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類的函數都可以使用類似的模式思考,加油! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 113.28.26.110 ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1434453447.A.401.html ※ 編輯: swedrf0112 (113.28.26.110), 06/16/2015 19:18:54 ※ 編輯: swedrf0112 (113.28.26.110), 06/16/2015 19:25:21

06/18 06:45, , 1F
很清楚 謝謝!
06/18 06:45, 1F
文章代碼(AID): #1LW0N7G1 (R_Language)
文章代碼(AID): #1LW0N7G1 (R_Language)