R語言(一)

自我介紹

什麼是 R 語言?

R 是一種專門用來進行統計分析與資料處理的程式語言。它免費、開源,擁有大量專門針對數據分析、圖表視覺化與統計建模的套件,因此被廣泛應用於學術研究、商業分析、生物醫學、金融等領域。R 語言的特色是語法靈活、功能完整,特別適合做報告、分析資料或建立統計模型。透過 R我們可以快速處理數據、計算統計量,並繪製出專業又美觀的圖表。如果你對資料有興趣,或是未來想從事資料科學、商業分析、研究報告等工作,R 會是非常實用的工具。

(-from chatgpt)

為什麼要學 R?

 R 可以幫你:

 - 整理數據 📂

 - 畫出圖表 📈

- 做出報告 📄

- 發現趨勢 🔍

安裝

本地編譯器

R、Rstudio : RStudio 是一個專門用來寫 R 的整合開發環境(IDE)

線上版

Posit Cloud (原 RStudio Cloud) :

  • 官方提供的雲端版 RStudio 可直接執行 R 程式、畫圖、做報告
  • 完整 RStudio IDE,支援 R Markdown、R Notebook、套件
  • 安裝免費有空間限制,但對教學、專案最友善
  • 免費帳號有 15 小時/月計算時間

💻 步驟一:註冊 Posit Cloud 帳號

1. 開啟網站 👉 https://posit.cloud/

2. 點擊右上角 Sign Up

3. 使用 Google 帳號快速登入

💻步驟二:建立第一個 RStudio 專案

  1. 登入後點選 New Project → New RStudio Project

  2. 等待數秒,系統會自動幫你開啟 RStudio

💻 步驟三:認識線上 RStudio 介面

① Script(左上):程式編輯區
寫 R 程式碼的地方可儲存為 .R 或 .Rmd 檔
適合寫多行程式、分析步驟、報告

(快捷鍵:Ctrl + Enter 執行選取的程式碼)

💻 步驟三:認識線上 RStudio 介面

② Console(左下):指令執行區
R 語言的互動命令列

可以直接輸入程式碼,立刻看到結果
適合快速測試、即時執行

💻 步驟三:認識線上 RStudio 介面

③ Environment / History(右上):變數與紀錄區
Environment:列出目前建立的變數與資料
History:記錄你輸入過的所有指令

可直接點選變數檢視內容、清除或重新執行變數

💻 步驟三:認識線上 RStudio 介面

④ Files / Plots / Packages / Help(右下):輔助功能區
Files:檔案總管
Plots:圖表顯示區
Packages:安裝、載入套件
Help:查詢說明文件(?mean)

💻 步驟四:寫下第一行 R 程式

print("Hello R World!")

💻 步驟五:建立 R 腳本(.R 檔)

  1. 點選左上角 File → New File → R Script

  2. 在編輯區寫入:

x <- c(1, 2, 3, 4, 5)
mean(x)

💻 步驟六:安裝套件

install.packages("tidyverse")
library(tidyverse)

R Markdown

&

R Notebook

標題 # 大標題
## 中標題
### 小標題
建立標題,類似 word 標題層級
粗體 **文字** 粗體字
斜體 *文字* 斜體字
有序清單 1. 項目1
2. 項目2
編號清單
無序清單 - 項目1
- 項目2
圓點清單
公式 $y = mx + b$ (行內)
$$E=mc^2$$ (置中)
LaTeX 公式
插入圖片 ![](圖片路徑) 插入圖片
超連結 [文字](網址) 建立超連結
區塊引用 > 引用內容 顯示引用文字
程式區塊 ```{r}
R程式碼
```
程式碼區塊 (Chunk)
表格 ` 欄1
分隔線 --- 水平分隔線

R Markdown vs R Notebook

特點R  MarkdownR Notebook
是否即時執行
適合 最終報告、論文 平時做筆記、互動教學
產出 pdf, html, word Notebook 互動文件或轉成 Markdown 報告
常見用法 論文、專題報告 實驗記錄、課堂互動筆記
# 📘 R 語言介紹與應用(教案簡報內容)

## 🧠 R 是什麼?

R 是一種專門用來進行「統計分析與資料處理」的程式語言。

- 免費、開源,可自由擴充  
- 擅長數據分析、圖表視覺化、模型建構  
- 全球學術界與資料分析師廣泛使用  



## ✨ R 的特色

- 免費開源,自由使用與擴充  
- 有數千個套件支援統計、圖表、機器學習等  
- 搭配 RStudio 使用體驗更佳  
- 支援 R Markdown 報告與互動教學  
- 適合學生與非資工背景學習  


## 📦 R 常見應用範圍

- 🎓 教育與學術:統計推論、回歸分析、論文報表  
- 📊 商業分析:顧客行為分析、視覺化報表  
- 🧬 生物醫學:基因資料、生存分析、臨床統計  
- 🏦 金融應用:股票分析、風險管理、回測模型  
- 🤖 資料科學與機器學習:模型建立與預測  



## 🧪 R 語法範例

```r
# 建立向量
scores <- c(80, 90, 70, 100)

# 計算平均
mean(scores)

# 繪製直方圖
hist(scores, main = "分數分布圖", col = "lightblue")

 R 基本語法與資料型態

向量 (Vectors)

向量是 R 語言中最基本的資料結構,用來儲存一維資料的變數類型。

數值numeric

整數integer

邏輯logical

文字character

日期date

日期時間POSIXct

*單一類型

a=100
class(a)

a=100L
class(a)

a=FALSE
class(a)

a="hello"
class(a)

a=Sys.Date()
class(a)
a
as.numeric(a)

a=Sys.time()
a

is.numeric(a)

向量類型

class()

is.numeric()

as.numeric()

數值numeric

整數integer

邏輯logical

文字character

日期date

日期時間POSIXct

  • c() (combine) : 將類別相同的元素合併同一個向量
  • length() : 向量長度
  • rep(物件, 重複次數)
  • 1 %in% a : 檢查 1 是不是在向量 a 裡面,會回傳 TRUE 或 FALSE
  • 中括號[ ]
a <- c(1,5.3,6,-2) 
a 

length(a)
rep(a, 3)
seq(1, 5, 2)
1 %in% a
a = c(1, 3, 5, 7, 9, 11)
a[1]
a[1:3]
a[a>8|a<2]

運算子

+
-
*
/
商數 %/%
餘數 %%
!
小於 < 
大於 >
等於 ==
不等於 !=
& 向量中每個元素個別比較
&& 單一元素比較
||
|
x <- c(TRUE, FALSE, TRUE)
y <- c(TRUE, TRUE, FALSE)

x & y
x[1] && y[1]

較複雜的資料結構

  1. 清單 list
  2. 陣列 array
  3. 因素 factor
  4. 矩陣 matrix
  5. 資料框架 dataframe

1. 清單 list

列表 (list) 跟向量很相似,但最大的不同在於列表可以包含不同資料屬性的資料。

# Create a list.
list1 <- list(c(2,5,3), 21.3, sin)

# Print the list.
print(list1)

# Create list and asign variable names.
list2  <- list(vector = c(2,5,3),
               numeric = 21.3,
               func = sin)

# Print names of list and list itself.
names(list2)
print(list2)

2.陣列 array

array 是 可以延伸超過 2 維的資料結構,本質上是「多維矩陣」。

# array(data, dim = c(列, 欄, 頁))
a <- array(1:12, dim = c(3, 2, 2))
print(a)

a[1, 2, 1]   # 第一頁、第一列、第二欄 → 取出 4
a[,,2]       # 第二頁整張矩陣

3.因素 factor

R 的因子(factor)變數是專門用來儲存類別資料的變數,它同時具有字串與整數的特性,主要以向量 (vector) 的形式呈現。在因子 物件中,會儲存:

(1) 所有不重複的數值作為標籤 (labels),會被當成字串 (character)(2) 每一個元素對應到的標籤。

# Create a vector.
apple_colors <- c('green','green','yellow','red','red','red','green')

# Create a factor object.
factor_apple <- factor(apple_colors)

# Print the factor.
print(factor_apple)
print(nlevels(factor_apple))

4. matrix 矩陣

R 中的矩陣 (matrix) 用來儲存二維資料,可以透過 matrix 函數填入向量得到。

# Create a matrix.
M <- matrix( c('a','a','b','c','b','a'), nrow = 2, ncol = 3)
print(M)

# Create a matrix and fill in by row.
M <- matrix( c('a','a','b','c','b','a'), nrow = 2, ncol = 3, byrow = TRUE)
print(M)
  • A * B:矩陣 A 與 矩陣 B 的元素間倆倆相乘
  • A %*% B:矩陣乘法 A⋅B
  • t(A):轉置矩陣 AT
  • solve(A):矩陣 A 的反矩陣

5. dataframe 資料框架

「資料框架」(Data Frame) 作為R最常見的資料型態。一個資料框架具備以下兩個原則:

Rows:通常代表的是個體 / 觀察對象

Columns:通常是變數

name <- c("David", "Hsi", "Jessie")
age <- c("24", "25", "36")
gender <- c("Male", "Male", "Female")

# Create by variables
data1 <- data.frame(name, age, gender)
data1

data2 <- data.frame(
  name = c("David", "Hsi", "Jessie"),
  age = c("24", "25", "36"),
  gender = c("Male", "Male", "Female")
)
data2

head(data2)
colnames(data2) <- c("Var_1", "Var_2","Var_3")
rownames(data2) <- c("1", "2", "3")
data2
summary(data2)

#head:取得資料框架前六比資料(預設是 6)。
#tail:取得資料框架後六比資料(預設是 6)。
#colnames:修改或查詢 column 名稱。
#rownames:設定 row 的名稱
#summary:顯示資料基本資訊。
#dim:回傳資料物件的維度(列數, 欄數)

tibble

tibble 是 data.frame 的升級版,讓你更容易讀、更安全地處理資料,在 tidyverse 中幾乎都是用 tibble。

library(tibble)

# 建立 tibble
tb <- tibble(
  name = c("Amy", "Ben", "Cindy"),
  score = c(90, 85, 88)
)

tb

#data.frame 和 tibble 互轉
df <- as.data.frame(tb)  # 將 tibble 轉為 data.frame
tb2 <- as_tibble(df)      # 將 data.frame 轉為 tibble

資料結構的常用函數

  • length(object) : 元素個素
  • unique(object) : 該物件的獨立元素
  • str(object) : 輸出該物件的基本架構
  • class(object) : 該物件屬於哪種資料結構
  • names(object) : 物件中元素的名稱
  • c(object,object,...) : 將物件合併為一個向量
  • object : 印出物件
  • rm(object) : 從工作空間中移除物件
x <- c(1, 1, 2, 2, 3, 3, 4, 4)
length(x)
unique(x)

data2 <- data.frame(
  name = c("David", "Hsi", "Jessie", "David", "Hsi"),
  age = c("24", "25", "36", "24", "30"),
  gender = c("Male", "Male", "Female", "Male", "Male")
)
data2
unique(data2)
str(data2)
class(data2)
names(data2)

題目練習

題目 1:學生成績表

請建立一個 data.frame 包含以下欄位:

name:c("Amy", "Ben", "Cindy", "David")

score:c(88, 76, 92, 60)

顯示所有 score 大於 80 的學生

顯示分數小於 90 且大於等於 60 的學生

新增一欄位 pass,若分數 >= 60 則為 TRUE,否則為 FALSE

題目練習

題目 2:銷售紀錄陣列(array + 索引)

建立一個 3 維的 array,表示三位銷售員(A, B, C)在兩個月份(Jan, Feb)中,針對兩項商品(P1, P2)的銷售數量:

sales <- array(1:12, dim = c(3, 2, 2)) # 3人 × 2品項 × 2月份 

 

1.顯示 1 月份的完整資料(也就是第 1 頁)

2.取出 C 員工在 2 月份 P2 商品的銷售量

3.計算整體銷售總和 sum(sales)

4.查出資料的維度

題目練習

 題目 3:邏輯條件過濾 + 結構判斷




  1. 顯示所有庫存中(in_stock == TRUE)且價格小於 150 的商品

  2. 顯示 df 的列數與欄數

  3. 顯示 df 的欄位名稱

  4. 判斷 df$price 是否為數值型態(使用 is.numeric()

df <- data.frame( 
	product = c("A", "B", "C", "D"), 
    price = c(150, 80, 120, 200), 
    in_stock = c(TRUE, FALSE, TRUE, TRUE) 
    )
df <- data.frame(
  name = c("Amy", "Ben", "Cindy", "David"),
  score = c(88, 76, 92, 60)
)

df[df$score > 80, ]
df[df$score >= 60 & df$score < 90, ]
df$pass <- df$score >= 60
sales <- array(1:12, dim = c(3, 2, 2))
sales[, , 1]
sales[3, 2, 2]
sum(sales)
dim(sales)
df <- data.frame(
  product = c("A", "B", "C", "D"),
  price = c(150, 80, 120, 200),
  in_stock = c(TRUE, FALSE, TRUE, TRUE)
)
df[df$in_stock & df$price < 150, ]
nrow(df)
ncol(df)
names(df)
is.numeric(df$price)

自訂函數

 

函數可以避免複製大量重複的程式碼,並且讓其他使用者可以使用你設計的函數。一個函數的組成包含三個重要部分:

-輸入變數x(可以有很多個)

-輸出變數y

-運算程式碼

f <- function(x){ 運算程式碼; return(y) }

df <- data.frame(
  a = rnorm(10), # Generate 10 standard normal random numbers
  b = rnorm(10),
  c = rnorm(10),
  d = rnorm(10)
)

df$a <- (df$a - min(df$a, na.rm = TRUE)) / 
  (max(df$a, na.rm = TRUE) - min(df$a, na.rm = TRUE))
df$b <- (df$b - min(df$b, na.rm = TRUE)) / 
  (max(df$b, na.rm = TRUE) - min(df$a, na.rm = TRUE))
df$c <- (df$c - min(df$c, na.rm = TRUE)) / 
  (max(df$c, na.rm = TRUE) - min(df$c, na.rm = TRUE))
df$d <- (df$d - min(df$d, na.rm = TRUE)) / 
  (max(df$d, na.rm = TRUE) - min(df$d, na.rm = TRUE))

對於一個資料框架的四個變數將原本的尺度轉換到 0-1 之間

建立一個使用者函數時會包含三個部分:

1. 命名一個函數

2. 決定函數的 input (Args) 與 output

3. variables 可以寫成 function(x, y, z)。

開發函數主體的運算程式碼

df <- data.frame(
  a = rnorm(10),
  b = rnorm(10),
  c = rnorm(10),
  d = rnorm(10)
)

RescaleByRange <- function(x){
  rng <- range(x, na.rm = TRUE)
  return((x - rng[1]) / (rng[2] - rng[1]))
}
RescaleByRange(df$a)

練習題

撰寫一個名為 SummarizeData 的函數,回傳輸入向量的平均值 (mean)、變異數 (var)、最大值 (max)、最小值 (min)、與中位數 (median)。

SummarizeData <- function(x){
  summary.df <- data.frame(x_mean = mean(x, na.rm = TRUE),
                           x_var = var(x, na.rm = TRUE),
                           x_max = max(x, na.rm = TRUE),
                           x_min = min(x, na.rm = TRUE),
                           x_median = median(x, na.rm = TRUE))
  return(summary.df)
}

SummarizeData(rnorm(10))

deck

By phoebe tsai

deck

  • 155