R - 平均數、中位數和眾數
Hello, 有志於學習R語言的程式設計師們!今天,我們將要進入R語言描述統計的世界。作為你們親切友善的鄰居計算機科學老師,我將指導你們了解平均數、中位數和眾數的概念。如果你從未寫過一行代碼也不用擔心——我們會從最基礎的知識開始,一起逐步學習。
平均數
讓我們從平均數開始,這可能是最常見的集中趨勢度量。用簡單的話來說,就是我們常說的「平均值」。
基本平均數計算
在R中計算平均數,我們使用mean()
函數。這裡有一個簡單的例子:
numbers <- c(10, 20, 30, 40, 50)
result <- mean(numbers)
print(result)
這將輸出:30
讓我們分解這一步驟:
- 我們使用
c()
函數創建一個名為numbers
的向量。 - 我們使用
mean()
函數來計算這些數字的平均值。 - 我們將結果存儲在一個名為
result
的變量中。 - 最後,我們打印出結果。
處理NA值
現在,如果我們有缺失數據,在R中以NA
表示,會發生什麼情況呢?讓我們看看:
numbers_with_na <- c(10, 20, NA, 40, 50)
result_with_na <- mean(numbers_with_na)
print(result_with_na)
這將輸出:NA
哦哦!R返回NA
,因為它不知道如何處理缺失值。但別擔心,我們有解決方案!
使用NA選項
我們可以告訴R忽略NA值,使用na.rm
選項:
numbers_with_na <- c(10, 20, NA, 40, 50)
result_na_removed <- mean(numbers_with_na, na.rm = TRUE)
print(result_na_removed)
這將輸出:30
好多了!通過設定na.rm = TRUE
,我們告訴R在計算平均數之前移除NA值。
使用修剪選項
有時候,我們希望從平均數計算中排除極端值。這時trim
選項就派上用場了。它允許我們在計算平均數之前,從數據兩端修剪一定百分比的值。
numbers <- c(1, 2, 3, 4, 5, 100) # 注意異常值100
result_trimmed <- mean(numbers, trim = 0.1)
print(result_trimmed)
這將輸出一個接近3.5
的值
通過設定trim = 0.1
,我們從每端移除10%的數據,然後計算平均數。這有助於減少異常值的影响。
中位數
中位數是當數據集按從小到大的順序排列時的中间值。它受異常值的影响較平均數小。
numbers <- c(1, 3, 5, 7, 9, 11, 13)
result_median <- median(numbers)
print(result_median)
這將輸出:7
median()
函數的工作原理與mean()
類似。它還有一個na.rm
選項用於處理NA值:
numbers_with_na <- c(1, 3, NA, 7, 9, 11, 13)
result_median_na <- median(numbers_with_na, na.rm = TRUE)
print(result_median_na)
這將輸出:8
眾數
有趣的是,R沒有內置的眾數(最頻繁的值)函數。但別擔心!我們可以創建自己的函數:
get_mode <- function(v) {
uniqv <- unique(v)
uniqv[which.max(tabulate(match(v, uniqv)))]
}
numbers <- c(1, 2, 2, 3, 3, 3, 4, 4, 5)
result_mode <- get_mode(numbers)
print(result_mode)
這將輸出:3
讓我們分解這個自定義函數:
-
unique(v)
獲取向量中的唯一值。 -
match(v, uniqv)
找到匹配的位置。 -
tabulate()
計算出現次數。 -
which.max()
找到最大計數的位置。 - 我們返回該位置的值。
函數總結
這裡有一個方便的表格,總結了我們學習的函數:
度量 | 函數 | 選項 |
---|---|---|
平均數 | mean() | na.rm, trim |
中位數 | median() | na.rm |
眾數 | 自定義函數 | N/A |
記住,熟能生巧!嘗試在不同的數據集上使用這些函數,並探索改變選項如何影響結果。
當我們結束時,我想起了我學習R語言初期的故事。我曾經花了好幾個小時嘗試計算一個數據集的平均數,最後才發現我忘記移除NA值了。不要像我這樣——總是檢查你的數據,並在需要時使用na.rm = TRUE
!
快樂編程,願你在R的統計冒險中充滿洞見和驚喜時刻!
Credits: Image by storyset