[R語言初學] R語言的基本運算
5![[R語言初學] R語言的基本運算](https://i0.wp.com/r-lover.com/wp-content/uploads/2023/03/45267270_1826360564139036_4887411193569869824_n.jpg?fit=918%2C1632&ssl=1)
Last Updated on 2023-10-05
R語言當中要怎麼算數學?怎麼比大小?替變數取名字的時候要注意些什麼?本文告訴你
你知道R語言當中有什麼基本的運算嗎?替變數取名字的時候又該注意些什麼?本文會介紹R語言當中的基本運算,包含數學、比較、邏輯等,並一併討論替變數取名字時的規則,還有應該遵守的規範。
上一篇文章介紹完資料型態後,這邊要介紹在R語言當中的基本運算。不過,在開始之前,要先討論在R語言當中一個基本語法:賦值(assignment),意思是把「東西」儲存在變數裡面。
變數與賦值
賦值的方法
我們可以利用 <-
符號或者 =
賦值,不過在R語言的寫作風格中通常會用前者,用後者也沒有不行啦!
以國小數學常見的應用來說,我們可以把6
存在變數x
裡面,接下來可以拿x
運算。
x <- 6
y = 7
x+y
#> [1] 13
x*y
#> [1] 42
在上面的例子中,x
和y
都是長度為1的向量(vector,資料結構的一種),資料型態則為數值,我們在後面介紹讀取資料的章節中,會展示如何將匯入csv
、xlsx
等不同類型的檔案,同樣可以存到x
或者y
當中。
幫變數取好名字
要怎麼取變數的名稱呢?除了簡單的英文字母外,其實有些慣例與限制。我們先談限制,變數名稱可用的元素的包含字母、數字、點(.)、底線(_)等;但是,不能使用百分比符號(%),也不能用數字或者底線開頭;雖然可以用點開頭,但是底線後面不能接著數字。
# valid
xyz <- 1
xy1 <- 1
xy. <- 1
xy_ <- 1
.xy <- 1
._xy <- 1
# invalid
%xy <- 1
1xy <- 1
_xy <- 1
.2xy <- 1
#> Error: <text>:10:1: 未預期的輸入
#> 9: # invalid
#> 10: %xy <- 1
#> ^
考慮到這些規則有點複雜,我自己的建議是至多使用底線和英文字母就好,盡量避免使用點和數字,免得混淆。至於慣例部分,比較像是想要寫出清晰易懂的程式碼需要注意的事情,初學者可能不好掌握,只要記得重點即可:要有意義、有一致性、不要太長也不要太短。
舉例來說,假設你現在想要計算營運一家麵包店的單日損益,先扣除水電不計,且架設麵包售出率為80%。
簡單將成本拆解成人力與麵包,收入則是單看麵包出售收益,則人力成本可以再拆解成開店時數
x店員數量
x店員時薪
,麵包成本則是麵包烘烤小時數
x每小時麵包產量
x麵包成本
,收益等於是麵包烘烤小時數
x每小時麵包產量
x麵包售價
x售出率
。
會用到的變數包含開店時數、店員數量、店員時薪、麵包烘烤小時數、每小時麵包產量、每個麵包的成本、每個麵包的售價、售出率,那麼在取變數名稱時,要能夠讓讀程式碼的人知道你在寫些什麼,但又不要太過複雜,免得不易使用。
hour_work <- 8 #開店時數
hour_oven <- 4 #麵包烘烤小時數
bread_n_hour <- 4 #每小時麵包產量
bread_cost <- 15 #每個麵包的成本
bread_price <- 40 #每個麵包的售價
per_sold <- 0.8
employee_n <- 3 #店員數量
employee_salary <- 250 #店員時薪
# 收入部分
total_revenue <- hour_oven*bread_n_hour*bread_price*per_sold
# 成本部分
total_cost <- hour_work*employee_n*employee_salary + hour_oven*bread_n_hour*bread_cost
# 計算損益
total_revenue - total_cost
#> [1] -5728
結果算出來無奈賠錢。為什麼要搞得那麼複雜,用一大堆變數儲存這些數字,不乾脆直接運算呢?主要有兩個原因。
首先,這些數字都可能會變動,例如店員數量改變、時薪上升,或者是麵包成本調整,若遇上改變就要重新改算式,很容易混淆,但現在有了變數,就只要改那個變數的值就好。
再者,現在的算式規模不大,只有考慮人力成本與生產成本,但如果進一步考慮麵包種類、水電、租金、包材等,若是純粹用數字,光是理解數字對應到的意思就會花上太多時間。
不過,這裡面變數名稱的取法是我的個人習慣,你可以不用照做。舉例來說,total_revenue
就可以改稱revenue_total
,或者有些人會簡稱為rev_total
,只要常使用、能夠望文生義、有一致性,那就沒有太大問題。
當我們賦值後呈現結果,這個動作被稱為「列印」(print),其實就是英文直翻。可以直接打出變數,也可以使用print()
函數,為什麼要多此一舉?因為後面我們不只會印出變數,還會加上其他訊息,所以才會介紹這個函數。
x <- 6
x
#> [1] 6
print(x)
#> [1] 6
R語言中的基本運算
數學運算
因為後面處理資料時,會用到數學,例如計算政治獻金時至少會需要加剪法,就算討厭數學還是要了解一下,至少運算本身都可以交給電腦,你只要會用就好,已經賺到了。
底下是常用的數學運算符號:
+
,-
,*
,/
:加減乘除^
或者**
:次方(power)-
:放在次方上面有倒數的意思%/%
:算商數%/%
:算餘數
# 次方
2^5
#> [1] 32
2**5
#> [1] 32
# 比較
2^(-2) #2^(1/2)
#> [1] 0.25
(-2)^2
#> [1] 4
# 商數
12%/%5
#> [1] 2
# 餘數
19%%5
#> [1] 4
取商數和取餘數看起來很無聊,但是在迴圈(loop)章節會非常實用!例如進行到第11、21、31圈時,我們希望R提醒自己,這時候就可以取迴圈的圈數除以10的餘數為1,跳出通知訊息。
另外,既然可以計算次方,自然也可以開方根,以立方根為例,我們想找125
的立方根,意思就是說,某個變數z
的平方為125
,這樣來說,只要取125
的(1/3)次方,就能夠得到z
了!
125^(1/3)
#> [1] 5
那如果我們想要找4的平方根,先稱它為變數a
,又要怎麼做呢?上面我們是直接取4^(1/2)
,這邊想換個做法,直接看能不能用a
來找,既然a
的平方為4,那試著列出式子來找:
a^2 <- 4
#> Error in a^2 <- 4: 找不到物件 'a'
結果跳出了錯誤訊息,上面寫說物件a
並不存在。為什麼會這樣?因為這跟我們在算數學不一樣,算數學的時候我們可以假設有個變數a
的平方為4
,再來反推a
的值。
但是在R裡面,並不存在a
這個東西,我們在賦值的時候是告訴電腦說有個變數,它的名字叫什麼、要指定什麼內容給它,用比喻來說,電腦會打開一個櫃子,把內容存在裡面,並且在櫃子上面貼上貼紙。
因此,既然事前沒有a
這個櫃子,我們一上來就想跟電腦說,a
的平方就是4
!它自然不知道我們在幹嘛了。
關係運算
關係運算也稱為比較運算(comparison),常用的包含:
>
:大於<
:小於>=
:大於等於<=
:小於等於==
:等於!=
:不等於
3 > 5
#> [1] FALSE
4 >= 4
#> [1] TRUE
5 != 4
#> [1] TRUE
3 == 4
#> [1] FALSE
單純比來比去沒什麼好玩,但是結合邏輯運算子一起比較,就有很多實際的用途了。另外,裡面最重要的就是判斷是否相等的==
,=
對應到的是賦值,兩者不要搞混了喔!我自己到現在有時候還是會寫錯,研究程式碼很久也看不出來問題到底出在哪。
邏輯運算
邏輯運算跟之前提過的布林邏輯有關,常用的包含:
- & 以及 &&:且大於等於
- | 以及 ||:或
- !:否定
!(5 > 4)
#> [1] FALSE
(5 > 4) & (3 > 2)
#> [1] TRUE
(5 > 4) & (2 > 2)
#> [1] FALSE
(5 > 4) | (3 > 2)
#> [1] TRUE
(5 > 4) | (2 > 2)
#> [1] TRUE
T & F
#> [1] FALSE
T | F
#> [1] TRUE
F & F
#> [1] FALSE
!F
#> [1] TRUE
!T
#> [1] FALSE
其中,&
和&&
有些不同。前者適用於以元素為單位(element-wise)的比較,後者則只看第一個元素。因為上面舉的例子當中,比較的對象(例如5
跟4
)的長度都只有1,所以看不出來,底下來看具體例子:
# 且
c(T,T,F) & c(T,F,F) #一個一個比
#> [1] TRUE FALSE FALSE
c(T,T,F) && c(T,F,F) #只看第一個
#> Warning in c(T, T, F) && c(T, F, F): 'length(x) = 3 > 1' in coercion to 'logical(1)'
#> Warning in c(T, T, F) && c(T, F, F): 'length(x) = 3 > 1' in coercion to 'logical(1)'
#> [1] TRUE
# 或
c(T,T,F) | c(T,F,F) #一個一個比
#> [1] TRUE TRUE FALSE
c(T,T,F) || c(T,F,F) #只看第一個
#> Warning in c(T, T, F) || c(T, F, F): 'length(x) = 3 > 1' in coercion to 'logical(1)'
#> [1] TRUE
這樣是不是能看出具體差異了!不過,後面會用到的基本上都是 &
以及 |
,所以,如果你覺得上面很難懂,也沒關係喔。
小結
這樣就結束了!我們從變數與賦值,一路介紹了數學、關係、邏輯等運算,接下來的文章會介紹資料結構,希望能夠帶你一步步進入R語言的世界。
2023-03-22 at 03:42 //
作者的文筆真是一絕,這篇文章寫得非常生動有趣。這裡有可以參考的應用文獻
2023-05-23 at 04:31 //
I am a student of BAK College. The recent paper competition gave me a lot of headaches, and I checked a lot of information. Finally, after reading your article, it suddenly dawned on me that I can still have such an idea. grateful. But I still have some questions, hope you can help me.
2023-05-25 at 03:55 //
Can you be more specific about the content of your enticle? After reading it, I still have some doubts. Hope you can help me.
2023-05-27 at 03:37 //
I may need your help. I’ve been doing research on gate io recently, and I’ve tried a lot of different things. Later, I read your article, and I think your way of writing has given me some innovative ideas, thank you very much.
2023-05-27 at 06:38 //
Thank you for your shening. I am worried that I lack creative ideas. It is your enticle that makes me full of hope. Thank you.