2016-02-22

用 R 算眾數

今天心血來潮,想重新學一下 R 來跑統計(大概重新學過 3 次了 ...)。用金門大學 陳鍾誠 老師的教材當範例:
習題 1 : 請模擬從班上隨機抽學生一萬次,看看誰與你最有緣 (抽到次數最多)
解答:假設班上有 59 人,那麼編為 1 到 59 號,於是我們可以用下列程式,進行 1 萬次抽樣, 並繪出統計圖。
 
> x=sample(1:59, 10000, TRUE)> hist(x, breaks=0.5:60)執行結果
想說來跑一下眾數,沒想到基本 package 沒有這個功能,冏。只好開始 google。最後大概有兩種公式,簡單整理一下。
第一個
as.numeric(names(table(x)))[table(x) == max(table(x))]

連結:來源一來源二
第二個
which.max(table(x))
連結:來源一來源二來源三
第三個
mode_dat=NULL
for(i in 1:1000){
dat=rnorm(1000)
ds=density(dat)
mode_dat=c(mode_dat,ds$x[which(ds$y==max(ds$y))])
}
連結:來源(看不懂
打完收工
借放:ANOVA


10 則留言:

  1. > x=c(5,5,5,2,2,2,2,2,2)
    > which.max(table(x))
    2
    1
    mode為2
    請問下面的1是什麼

    回覆刪除
    回覆
    1. 哈囉,我也一陣子沒用了,所以我只能盡量回答你看看

      先從整個式子來看。那個函式可以拆成兩個子式子:
      which.max // 用來看數列中最大的數字
      table(x) // 這邊可以用來看數列中,某數字出現的次數

      按下 table(x) 後會跑出
      x
      2 5
      6 3
      代表數列中的 2 出現六次,5 出現 3 次

      若將 table(x) 套回 which.max() 中
      它就會選出「出現次數最大的數字」,因此就跑出了 2
      而數字 2 的位置是第一個,所以第二列的回傳值就出現 1
      所以回答你的問題,「1」指的是出現次數最多的數字,它在 table 中的順序是第一的意思


      如果跑 which.min(table(x))
      那結果應該就會是
      5
      2

      給你參考看看 ~

      刪除
    2. 您好,謝謝回答,但是我在找mode時,出現了32和5,32是mode但是就不太懂5的意思了,以下附上公式還有數據,謝謝您
      read.csv("Xr04-17.csv")
      Q<-read.csv("Xr04-17.csv")
      #求mode
      which.max(table(Q$Speeds))
      32
      5
      數據:
      Speeds
      28
      29
      29
      30
      30
      30
      30
      30
      30
      30
      30
      30
      30
      30
      30
      30
      30
      30
      30
      31
      31
      31
      31
      31
      31
      31
      31
      31
      31
      31
      31
      31
      31
      31
      31
      31
      31
      31
      32
      32
      32
      32
      32
      32
      32
      32
      32
      32
      32
      32
      32
      32
      32
      32
      32
      32
      32
      32
      32
      32
      32
      32
      32
      32
      32
      33
      33
      33
      33
      33
      33
      33
      33
      33
      33
      33
      33
      33
      34
      34
      34
      34
      34
      34
      34
      34
      34
      34
      34
      34
      34
      35
      35
      35
      35
      35
      35
      35
      35
      35
      35
      35
      35
      36
      36
      36
      36
      36
      37
      37
      37
      37
      37
      38
      38
      38
      39
      39
      41
      41

      刪除
    3. 先幫你把資料轉成 r 比較好吃入的形式

      x = c(28,29,29,rep(30,16),rep(31,19),rep(32,27),rep(33,13),rep(34,13),rep(35,12),rep(36,5),rep(37,5),rep(38,3),39,39,41,41)

      先來看看 table(x) 結果長怎樣

      28 29 30 31 32 33 34 35 36 37 38 39 41
      1 2 16 19 27 13 13 12 5 5 3 2 2

      這代表說,32 在 table 中是第五個數字,而它在數列中的出現頻率是 27 次

      which.max() 會挑出最大的數值,也就是在 table 中出現次數最多(27)的那個數字(32)並列在第一列,而第二列則是他在 table 中的排序(5)

      刪除
    4. 我好像把你剛剛加問的提問刪掉了?抱歉

      刪除
    5. 懂了,非常感謝!

      刪除
  2. 當有兩個眾數時,以上的方法可能跑不出正確的結果喔
    例如
    x=c(3,3,3,3,3,4,4,4,4,4,50,100)
    which.max(table(x))
    結果還是會出現
    3
    1
    也就是
    which.max會把第一個出現的眾數當眾數─即使後面可能有和第一個眾數有著相同次數(frequency)的眾數

    回覆刪除
    回覆
    1. 喔喔喔感謝提醒!
      之後有處理到類似狀況的話,我會注意一下的

      刪除
  3. 多個眾數,也許可以試議以下方式喔
    x<-c(28,29,29,30,30,30,30,30,31,31,31,31,31,42,42,42)
    table(x)
    which(table(x)==max(table(x)))
    table()輸出結果為:
    x
    28 29 30 31 42
    1 2 5 5 3
    眾數計算結果為:
    30 31
    3 4

    回覆刪除
    回覆
    1. 有在 RStudio 測試語法了
      輸出結果和留言中的一樣
      感謝提供建議 ~

      刪除