[R語言初學] R語言的基本運算

5

Last Updated on 2023-10-05

Home » R語言教學 » R語言初學 » [R語言初學] R語言的基本運算

R語言當中要怎麼算數學?怎麼比大小?替變數取名字的時候要注意些什麼?本文告訴你


你知道R語言當中有什麼基本的運算嗎?替變數取名字的時候又該注意些什麼?本文會介紹R語言當中的基本運算,包含數學、比較、邏輯等,並一併討論替變數取名字時的規則,還有應該遵守的規範。

上一篇文章介紹完資料型態後,這邊要介紹在R語言當中的基本運算。不過,在開始之前,要先討論在R語言當中一個基本語法:賦值(assignment),意思是把「東西」儲存在變數裡面。

變數與賦值

賦值的方法

我們可以利用 <- 符號或者 = 賦值,不過在R語言的寫作風格中通常會用前者,用後者也沒有不行啦!

以國小數學常見的應用來說,我們可以把6存在變數x裡面,接下來可以拿x運算。

x <- 6
y = 7
x+y
#> [1] 13
x*y
#> [1] 42

在上面的例子中,xy都是長度為1的向量(vector,資料結構的一種),資料型態則為數值,我們在後面介紹讀取資料的章節中,會展示如何將匯入csvxlsx等不同類型的檔案,同樣可以存到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)的比較,後者則只看第一個元素。因為上面舉的例子當中,比較的對象(例如54)的長度都只有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語言的世界。

5 Comments

  1. Avatar Monty Woltemath
    2023-03-22 at 03:42 // Reply

    作者的文筆真是一絕,這篇文章寫得非常生動有趣。這裡有可以參考的應用文獻

  2. Avatar gate io kimlik doğrulama ne kadar sürer
    2023-05-23 at 04:31 // Reply

    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.

  3. Avatar binance register
    2023-05-25 at 03:55 // Reply

    Can you be more specific about the content of your enticle? After reading it, I still have some doubts. Hope you can help me.

  4. 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.

  5. Avatar binance register
    2023-05-27 at 06:38 // Reply

    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.

Leave a Reply