R base是R語言的基本程式庫和核心功能,提供了許多常用的指令和函數。以下是一些常見的R base指令:
- assignment operators(賦值運算符):<- 或 = 用來將數值、向量、函數等資料物件賦值給變數。
- arithmetic operators(算術運算符):+、-、*、/、^、%/%和%%用於數值運算,如加、減、乘、除、指數、整除和取餘等。
- relational operators(關係運算符):==、!=、>、>=、<和<=用於比較數值或字符型資料的大小關係,返回邏輯值(TRUE或FALSE)。
- logical operators(邏輯運算符):&、|和!用於對邏輯值進行運算,如AND、OR和NOT等。
- control flow statements(流程控制語句):if、else、for、while、repeat、break和next用於控制程式的執行流程。
- functions(函數):R base提供了許多內置函數,如sum、mean、var、sd、cor、lm等,用於數值計算、統計分析、線性回歸等常見操作。
- data structures(資料結構):R base提供了多種資料結構,如向量、矩陣、數組、列表、因子等,用於存儲和處理不同類型的資料。
- data input/output(資料輸入輸出):R base提供了多種函數和工具,如read.table、write.table、read.csv、write.csv等,用於讀取和寫入資料。
R可以做很複雜的加減乘除,例如直接在程式碼中打上(1+3)*2.01
,總之,看你算式怎麼寫,他就會算出相對應的數值。但其實我們通常使用R語言是要餵給他資料,然後讓他來做運算。此時,要有一個容器來容納這些數值或資料,這個容器就是變數(Variable)。
<-
將右邊的算式或數值指(Assign)給左邊的變數。左側都是變數,右側則可能是數字或變數。你可以把他想像為把右側做完了以後,指(Assign)給左側的變數。- Assignment對變數型態(Variable Type)的影響:
<-
右側如果是numeric,那左側的變數就是numeric變數;右側如果是character,左側的變數就是character變數。 - 在幾乎所有程式語言中,單等號
=
指的是assignment,把右方的算式、值或物件指給左方的變數。而比較兩者相不相等,則用雙等號==
,例如1==3-2
。R當初在設計時可能是為了避免混淆,所以把assignment的符號設計為<-
。
a <- 1
b <- c(1, 2, 3, 4)
c <- c("1", "2", "3", "4")
d <- c(b, a)
e <- "abcd"
- 註解:在程式碼區塊若前面有
#
字號後面跟著空白的話,那代表那行被標示為註解,程式執行時會自動跳過註解不執行。 - 快速鍵:當游標在某一行程式碼時打
cmd(ctrl)-shift-c
,就可以產生註解。
# df <- data.frame(a = c(1, 2, 3), b = c(3, 4, 5))
但我如果要為所有我要運算的數字都產生一個與之對應的變數,這樣做不完。所以,我們會很常使用其他種序列或者對應的結構來儲存多筆資料。例如vector
、list
或Data.Frame
。
在R語言中,vector是一種基本的資料類型,它是由相同類型的元素組成的序列,可以存儲數值、文字、邏輯值等不同類型的資料。例如,以下是一個由整數元素組成的vector:my_vector <- c(1, 2, 3, 4, 5)
。而我如果要存取第一個數字,我便可用my_vector[1]
的方式存取,分別代表my_vector中第一個位置的內容(第二個、第三個依此類推)。
在程式碼中,只要是文字必用成對的雙引號或單引號包含其中,以區隔「變數」和「數字」。例如如果看到沒有雙引號的「英文字母」必定是變數名稱,或函式名稱。如果看到有雙引號的數字,那也是文字。
以下資料來自各縣市平均每月薪資所得或各縣市人口數。
vector通常用c()
函數創建,其中c表示"combine"或"concatenate",可以將多個元素組合成一個vector。
income <- c(70100, 51300, 51100, 48400, 47600, 43000)
county <- c("台北", "新北", "桃園", "高雄", "台中", "台南")
population <- c(2.6, 3.9, 2.2, 2.7, 2.8, 1.8)
area <- c(271.8, 2052.5, 1221, 2951.9, 2214.9, 2191.7)
income
## [1] 70100 51300 51100 48400 47600 43000
county[c(5, 3, 1)]
## [1] "台中" "桃園" "台北"
county <- county[c(5, 3, 1)]
county
## [1] "台中" "桃園" "台北"
area
## [1] 271.8 2052.5 1221.0 2951.9 2214.9 2191.7
population
## [1] 2.6 3.9 2.2 2.7 2.8 1.8
a <- seq(11, 99, 11)
a
## [1] 11 22 33 44 55 66 77 88 99
b <- 11:20
b
## [1] 11 12 13 14 15 16 17 18 19 20
x <- runif(10000000, 1, 10) # uniform dist, n=1000
plot(density(x))
x <- rnorm(1000, 1, 10) # uniform dist, n=1000
plot(density(x))
x <- rnorm(10000000, 1, 10) # normal dist, n=1000
plot(density(x))
你可以嘗試這麼問ChatGPT以獲得一些測試資料「可否幫我建立一個R語言的測試資料,為台北11個行政區的區名、人口數、地理面積。分別用vector來儲存,最後再把三個vector合併為一個dataframe」,觀察看看會有什麼樣的結果。
county
## [1] "台中" "桃園" "台北"
income
## [1] 70100 51300 51100 48400 47600 43000
head(county)
## [1] "台中" "桃園" "台北"
tail(county)
## [1] "台中" "桃園" "台北"
length(county)
## [1] 3
mode(county)
## [1] "character"
class(county)
## [1] "character"
# View(county)
length(county)
## [1] 3
length(income)
## [1] 6
vector可以用中括號[]
搭配數字來取用vector中的元素,下標從1開始。例如,要取用上述的vector中的第三個元素,可以使用my_vector[3]
。
It is important to know how to neglect first n or last n elements. For example, a[1:(length(a)-2)] will neglect the last two elements. Thinking why I need parentheses for length(a)-2
here.
county
## [1] "台中" "桃園" "台北"
county[c(5, 3, 1)] # how about country[c(1, 3, 5)]
## [1] NA "台北" "台中"
county[3:6] # is it equal to country[c(3, 4, 5, 6)]
## [1] "台北" NA NA NA
a <- 11:19
a[3:length(a)]
## [1] 13 14 15 16 17 18 19
a[length(a):3]
## [1] 19 18 17 16 15 14 13
- Without assignment, deletion won't change original vectors
b <- 11:20
b[-(3:5)]
## [1] 11 12 16 17 18 19 20
b[-c(1, 3, 5)]
## [1] 12 14 16 17 18 19 20
b
## [1] 11 12 13 14 15 16 17 18 19 20
- Correct deleting operations with assignment to replace original vector
b <- b[-(3:5)]
b
## [1] 11 12 16 17 18 19 20
a <- seq(11, 99, 11)
a <- a[-c(1, 3, 5)]
a
## [1] 22 44 66 77 88 99
- Concatenating is quite useful for web crawling when you crawl article links page by page. You may be not sure the number of page you need to crawl. So you need to append entire new vector to old vector. It is concatenating. ("Appending" often means adding one new element at the end of data.)
a <- 1:10
a <- c(a, 11)
a
## [1] 1 2 3 4 5 6 7 8 9 10 11
b
## [1] 11 12 16 17 18 19 20
a <- c(a, b)
a
## [1] 1 2 3 4 5 6 7 8 9 10 11 11 12 16 17 18 19 20
a <- c(a, a, b)
a
## [1] 1 2 3 4 5 6 7 8 9 10 11 11 12 16 17 18 19 20 1 2 3 4 5 6 7
## [26] 8 9 10 11 11 12 16 17 18 19 20 11 12 16 17 18 19 20
a <- 11:19
a + 3
## [1] 14 15 16 17 18 19 20 21 22
a / 2
## [1] 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5
a %% 2
## [1] 1 0 1 0 1 0 1 0 1
a %/% 2
## [1] 5 6 6 7 7 8 8 9 9
a %% 2== 0
## [1] FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE
which(a %% 2== 0)
## [1] 2 4 6 8
a[which(a%% 2 == 0)]
## [1] 12 14 16 18
a[c(2, 4, 6, 8)]
## [1] 12 14 16 18
a %% 2 != 0
## [1] TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE
a[a%% 2 == 0]
## [1] 12 14 16 18
a[a%%2 != 0]
## [1] 11 13 15 17 19
a <- a %% 2 # modular arithmetic, get the reminder
a <- a %/% 2 # Quotient
a %% 2 == 0 # deteting odd/even number
## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
a %% 2 != 0
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
a[a%%2==0]
## [1] 0 0 0 0 0 0 0 0 0
a > b
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
income > mean(income)
## [1] TRUE FALSE FALSE FALSE FALSE FALSE
TRUE == T # == equal to,
## [1] TRUE
TRUE != F # != Not equal to
## [1] TRUE
any(a>11) # is there any element larger than 1
## [1] FALSE
all(a>11) # are all elements larger than 1
## [1] FALSE
- two methods to filter data from vectors, by index vector or a logical vector with equal length.
a <- seq(11, 55, 11)
a[c(T, F, T, F, T)]
## [1] 11 33 55
a[a%%2==1]
## [1] 11 33 55
a%%2
## [1] 1 0 1 0 1
a%%2==1
## [1] TRUE FALSE TRUE FALSE TRUE
a <- c("你好","你好棒棒","你好棒","你真的好棒")
a[nchar(a)>3]
## [1] "你好棒棒" "你真的好棒"
# which will return "index-of"
a <- seq(11, 55, 11)
a[which(a%%2==1)]
## [1] 11 33 55
which(a%%2==1)
## [1] 1 3 5
-
sort(x)
的結果必須用<-
覆蓋原本的x
,此時的x
才算被排序的結果。 -
order(x)
函式會傳回x
數值由小到大的索引。這個例子的結果是5, 4, 3, 6, 1, 2
,也就是5
位置的那個數最小、4
那個位置的數次小、接下來3, 6, 1, 2
。 -
x[order(x)]
把order(x)
結果(也就是c(5, 4, 3, 6, 1, 2)
)傳給原本的x
便會使得原本的x
重新排序。通常order()
的用途是,我們可以將兩個等長的variables例如var1和var2,依據var2來重新排序var1,例如var1[order(var2)]。
x <- c(33, 55, 22, 13, 4, 24)
mode(x)
## [1] "numeric"
class(x)
## [1] "numeric"
sort(x)
## [1] 4 13 22 24 33 55
# x <- sort(x) # assign to replace original x
order(x)
## [1] 5 4 3 6 1 2
x[order(x)]
## [1] 4 13 22 24 33 55
x[c(5, 4, 3, 6, 1, 2)]
## [1] 4 13 22 24 33 55
a <- 11:19
min(a); max(a); mean(a); median(a); sd(a)
## [1] 11
## [1] 19
## [1] 15
## [1] 15
## [1] 2.738613
log2(a)
## [1] 3.459432 3.584963 3.700440 3.807355 3.906891 4.000000 4.087463 4.169925
## [9] 4.247928
log1p(a)
## [1] 2.484907 2.564949 2.639057 2.708050 2.772589 2.833213 2.890372 2.944439
## [9] 2.995732
?log1p
mode(county) # character
## [1] "character"
mode(income) # numeric
## [1] "numeric"
mode(income > mean(income)) # logical
## [1] "logical"
testing <- c("26.142", "12.008", "7.032", "13.646", "4.589")
mode(testing) # character
## [1] "character"
-
numeric vector可以用
as.character(x)
轉成charcter
;logical vector可以用as.numeric(x)
轉為numeric
。概念上可以說是character > numeric > logical
。 -
如果硬是在logical vector後附加一個numeric element的話,那就會整個vector被轉為numeric vector;相仿地,如果numeric vector後附加一個character element的話那整個vector就會被轉為character vector。
-
可以用
sum()
函式來計算logical vector有幾個TRUE
值。例如sum(a%%2==1)
就是計算a
中有幾個奇數。TRUE
可視為1
、FALSE
可視為0
,所以加總起來就是TRUE
有幾個。
income.c <- as.character(income)
population.c <- as.numeric(population)
a <- seq(11, 99, 11)
a <- c(a, "100")
a <- seq(11, 99, 11)
sum(a%%2==1)
## [1] 5
max(a)
## [1] 99
a <- seq(11, 55, 11)
paste("A", a) # concatenate
## [1] "A 11" "A 22" "A 33" "A 44" "A 55"
paste0("A", a) # concatenate
## [1] "A11" "A22" "A33" "A44" "A55"