搜尋感興趣的網誌

所有文章連結

顯示具有 base 標籤的文章。 顯示所有文章
顯示具有 base 標籤的文章。 顯示所有文章

2022年3月31日 星期四

R basic operation - input、output | R基礎操作 - input、output

 


小雷在寫數據分析的時候,並不會用到input與output,所以也沒特別注意R語言的輸入輸出,但是寫到與機器學習相關的部份時,需要用到輸入輸出,這時候才發現怎麼跟Python不一樣!居然不是一個print走天下(或許有別的,但小雷只用過print!),看了一下base包內的資訊,才發現輸入輸出有不少不一樣的函數!!所以寫幾篇做個備忘,有需要的朋友也可以參考參考。


輸入

`readline()` : 允許從終端機輸入

readline文章 >> 請點我



輸出

`print()` : 輸出值或因子

print文章 >> 請點我


`paste()` : 連接字符後輸出

paste文章 >> 請點我


`cat()` : 可以進行計算後輸出

cat文章 >> 請點我


R basic operation - cat | R基礎操作 - cat

 


輸出最後一個函數是cat,除了輸出數值外,還可以進行計算後輸出,算是最像Python的輸出方式


基本語法

cat(輸出內容)


可用參數

sep = " " >> 設定輸出要添加的字符


設定數據準備進行輸出

# 字串
cat_df <- list(
    animal = c("dog", "cat", "rat", "fish", "lion")
)

# 數字
num <- as.numeric(0:10)


數字進行一般輸出,計算後輸出,重複輸出

# 一般輸出
cat(num)

# 輸出結果
r$> cat(num) 0 1 2 3 4 5 6 7 8 9 10


# 一般輸出 + 字符串
cat("number : ", num)

# 輸出結果
r$> cat("number : ", num) number : 0 1 2 3 4 5 6 7 8 9 10


# 加入sep參數
cat(num, sep = "~~~")

# 輸出結果
r$> cat(num, sep = "~~~")
0~~~1~~~2~~~3~~~4~~~5~~~6~~~7~~~8~~~9~~~10


# 計算輸出
cat("number : ", num * 10)

# 輸出結果
r$> cat("number : ", num * 10) number : 0 10 20 30 40 50 60 70 80 90 100


# 重複性輸出
cat("number : ", rep(num, 2))

# 輸出結果
r$> cat("number : ", rep(num, 2)) number : 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10


字符類的基本上是一樣

# 一般字符輸出
cat(cat_df$animal)

# 輸出結果
r$> cat(cat_df$animal) dog cat rat fish lion


# 加入sep參數
cat(cat_df$animal, sep = "~~~")

# 輸出結果
r$> cat(cat_df$animal, sep = "~~~") dog~~~cat~~~rat~~~fish~~~lion


# 重複性輸出
cat("number : ", sep = "::", rep(cat_df$animal, 2))

# 輸出結果
r$> cat("number : ", sep = "::", rep(cat_df$animal, 2)) number : ::dog::cat::rat::fish::lion::dog::cat::rat::fish::lion

R basic operation - paste | R基礎操作 - paste

 


paste主要的用法是在於連接各個字符串後輸出,輸出時會將數字一併轉為字符輸出,也可以不要輸出,連接字符後轉為存入變量


基本語法

paste(一個或多個向量, ...)


可用參數

sep = " " >> 空格分隔字符串

collapse = NULL >> 如何分隔字符串


建立數字與字符的數據

# 數字數據
num <- as.numeric(1:10)

# 文字數據
letter <- tibble(
    animal = c("dog", "cat", "rat", "fish", "lion")
)


數字連接後輸出,並設定不同連接方式

# 空格分隔
paste(num, sep = " ")

# 輸出結果
r$> paste(num, sep = " ") [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"


# 設定 - 分隔
paste(num, collapse = "-")

# 輸出結果
r$> paste(num, collapse = "-") [1] "1-2-3-4-5-6-7-8-9-10"


# 設定 <> 分隔
paste(num, collapse = "<>")

# 輸出結果
r$> paste(num, collapse = "<>") [1] "1<>2<>3<>4<>5<>6<>7<>8<>9<>10"


字符輸出也是同樣的方式

# 空格分隔
paste(letter$animal, sep = " ")

# 輸出結果
r$> paste(letter$animal, sep = " ") [1] "dog" "cat" "rat" "fish" "lion"


# 設定 - 分隔
paste(letter$animal, collapse = "-")

# 輸出結果
r$> paste(letter$animal, collapse = "-") [1] "dog-cat-rat-fish-lion"


# 設定 <> 分隔
paste(letter$animal, collapse = "<>")

# 輸出結果
r$> paste(letter$animal, collapse = "<>") [1] "dog<>cat<>rat<>fish<>lion"

R basic operation - readline | R基礎操作 - readline

 


有時需要從終端機進行輸入的操作,若是Python輸入,基本上就是input,R輸入的方式比較多元,也著實少了點直譯的方式,要記住的函數比較多,輸入的方式基本上有兩個函數,分別是`scan()`、`readline()`,本篇討論的是readline,scan的輸入參數較多,用法上除了輸入外,也可以導入文件,所以本篇就先不以scan做討論,以下是readline的基本操作


基本語法

readline(prompt = " ")


可用參數

prompt : 提示用戶輸入字串,所以需要加上" "


實際進行輸入,先來輸入姓名,輸入完成直接在終端機出現輸入字符,但是沒有存數任何變數,所以也沒有甚麼用途

# 提示用戶輸入字符
readline(prompt = "請輸入姓名 : ")

# 輸出結果
r$> readline(prompt = "請輸入姓名 : ") 請輸入姓名 : Rex [1] "Rex"


輸入完成存入變數

# 提示用戶輸入字符
name <- readline(prompt = "請輸入姓名 : ")

# 終端輸入後存入變數
r$> name <- readline(prompt = "請輸入姓名 : ") 請輸入姓名 : Rex

# 輸出結果
name

r$> name [1] "Rex"


存入變數之前可以進行型態調整,字符 >> 整數或浮點

# 提示用戶輸入字符並調整型態後存入變數
age <- as.integer(readline(prompt = "輸入年齡 : "))

# 輸出結果
str(age)

r$> str(age) int 30


# 提示用戶輸入字符並調整型態後存入變數
float <- as.numeric(readline(prompt = "輸入小數點 : "))

# 輸出結果
str(float)

r$> str(float) num 33.3

R basic operation - print | R基礎操作 - print

 


R print有別於Python的print,不是混合用的類型,而是單純以輸出值的函數,用法上除了列印一般的值,也可以列印出因子,參數的部分不少,也都是用在較為特殊的地方。


基本語法

print(要列印的項目, ..)


可用參數 - 因子

quote = FALSE >> 字符串是否要括號

max.levels = NULL >> 因子列印多少個等級

width : getOption("width) >> 設定輸出寬度


可用參數 - 表格

digits = getOption("digits") >> 小數點的輸出數量

quote = FALSE >> 字符串是否要括號

na.print = "" >> NA的輸出方式

zero.print = "0" >> 0的字符輸出方式

right = is.numeric(x) || is.complex(x) >> 靠右對其

justify = "none" >> 字符串的對其格式


接下來列印一些比較常用的輸出 >> 小數點輸出,digits設定的不只是小數點,包含整數位

# 設定一個小數點變數
float <- as.numeric(31.12346)


# 輸出結果
print(float, digits = 2)

r$> print(float, digits = 2) [1] 31

# 輸出結果
print(float, digits = 4)

r$> print(float, digits = 4) [1] 31.12


接下來印列因子,直接列印與參數效果

# 設定因子變數
factor_df <- factor(
    factor_df$animal,
    levels = c("dog", "cat", "rat", "fish", "lion")
    )


# 輸出結果
print(factor_df)

r$> print(factor_df) [1] dog cat rat fish lion Levels: dog cat rat fish lion

# 輸出結果
print(factor_df, quote = TRUE, max.levels = 3)

r$> print(factor_df, quote = TRUE, max.levels = 3) [1] "dog" "cat" "rat" "fish" "lion" 5 Levels: "dog" "cat" ... "lion"

2022年3月24日 星期四

R basic operation | R基礎操作

 


在認識R語言之前,小雷已經有上過Python的課程,所以一開接觸R,對於一些操作有點搞不清楚,多嘗試幾次後才慢慢熟練,這篇希望介紹一些基礎的語法,也會不定期更新基礎的操作。


關於R Packages介紹 >> 請點我

R語言的輸入輸出 >> 請點我


基礎操作

  • 賦值<- : 賦值的用意在於將右邊的值賦予到左邊的變量之中,中間用的是” <- “,類似一個方向的箭頭,在python中就只是簡單的” = ”,R的賦值不是很好輸入,所以若是用VScode就需要設定快捷鍵,RStudio則是本身就有快捷鍵,若是方向相反,則意義相反,但好像不是那麼常用到就是了。

# 賦值 <-
num_df <- tibble(number = c(1,2,3,4,5,6,7,8,9))

 

  • 範圍選取[] : 有時數據集中的數據過多,想先選擇一個範圍,或是要刪除某些值時就會用到,寫法上要注意的是最末端一定要加一個逗點作為結束,否則會出現錯誤。

# 錯誤的輸入
num_df[1:5]
 
# 輸出結果
Error: Can't subset columns that don't exist.
x Locations 2, 3, 4, and 5 don't exist.
i There are only 1 column.
 
 
# 選取範圍(變量中的範圍,不是特定值)
num_df[1:5, ]
 
# 輸出結果
r$> num_df[1:5, ]
# A tibble: 5 x 1
  number
   <dbl>
1      1
2      2
3      3
4      4
5      5
 
# 選取特定值
num_df <- num_df[num_df$number < 3, ]
 
# 輸出結果
r$> num_df
# A tibble: 2 x 1
  number
   <dbl>
1      1
2      2

 

  • Pipes通道%>% : 這個也是R裡面很特別的語法,用意是連結不同的函數,將各個函數的輸出應用到其他的函數上,使的好理解與閱讀,缺點是不好輸入,沒有快捷鍵實在是不好打,這部分Python就顯得人性化許多,一個tab就解決了。
# 利用pipes結合其他函數
num_df <- num_df %>%
    select(number) %>%
    filter(number > 3)

# 輸出結果
$> num_df # A tibble: 6 x 1 number <dbl> 1 4 2 5 3 6 4 7 5 8 6 9


  • 鎖定數據集欄位變量$ : 用於告訴R,現在要操作的是哪一個欄位變量,或是要將數值操作傳回哪一個欄位變量,有時候沒有指定時,會將整個數據集覆蓋掉,這個也是比較特別的用法。
# 創建一個tibble存入數值
num_df <- tibble(
    number = c(1,2,3,4,5,6,7,8,9),
    letter = c("a", "b", "c", "d", "e", "f", "g", "h", "j"))

# 使用$告訴R要修改哪個欄位的數值
num_df$letter <- recode(num_df$letter, "a" = "apple")

# 輸出結果
$> num_df # A tibble: 9 x 2 number letter <dbl> <chr> 1 1 apple 2 2 b 3 3 c 4 4 d 5 5 e 6 6 f 7 7 g 8 8 h 9 9 j

# 忘記指定欄位時結果
num_df <- recode(num_df$letter, "a" = "apple")

# 原本的number欄位被覆蓋掉了
r$> head(num_df) [1] "apple" "b" "c" "d" "e" "f"  

  • 移除 ! : 這個操作上也不是那麼的直覺,基本上刪除時會以row為單位,整行刪光光,所以覆蓋回去時反而不需要$,以下放上兩種操作方式
# 創建一個tibble存入數值
num_df <- tibble(
    number = c(1,2,-1),
    letter = c("a", "b", "c")
    )

r$> num_df # A tibble: 3 x 2 number letter <dbl> <chr> 1 1 a 2 2 b 3 -1 c

# 賦值左邊指定變量
num_df$number <- num_df[!(num_df$number < 0), ]

# 無法操作,因為行數會不相同
$> num_df$number <- num_df[!(num_df$number < 0), ] Error: Assigned data `num_df[!(num_df$number < 0), ]` must be compatible with existing data. x Existing data has 3 rows. x Assigned data has 2 rows. i Only vectors of size 1 are recycled.


# 賦值回整份數據
num_df <- num_df[!(num_df$number < 0), ]

# 輸出結果
r$> num_df # A tibble: 2 x 2 number letter <dbl> <chr> 1 1 a 2 2 b

  • 參數欄位變量 = : 各個函數內若有參數要修改,指定的方式就不是<-了,但若是逗點", ",意思就是不同的變量做個區隔
num_df <- tibble(
    number = c(1,2,-1),
    letter = c("a", "b", "c")
    )

  • ggplot 的函數連結 + : 整理完需要繪圖時R基本應該就是用ggplot了,ggplot的各個函數連結時用的是加號,一開始常常會跟<-或是%>%搞混
# 正常用法
num_df <- num_df %>%
    ggplot(mapping = aes(
        x = number,
        y = letter)) +
    geom_point()

# 錯誤用法
num_df <- num_df %>%
    ggplot(mapping = aes(
        x = number,
        y = letter)) %>%  
    geom_point()

r$> # 錯誤用法 num_df <- num_df %>% ggplot(mapping = aes( x = number, y = letter)) %>% geom_point() Error: `data` must be a data frame, or other object coercible by `

  • 載入Packages : Python的載入方式是import(),R則是library(),至於為什麼?這個可能要問R的原始作者George Ross Ihaka與Robert Clifford Gentleman兩位神人大大了😂
library(tidyverse)
library(lubridate)
library(dplyr)

  • 安裝Packages : 比Python多了個packages,不過也只是安裝一次,倒是沒有甚麼影響。
install.packages("dplyr")

其他文章

看看精選文章

納希克房價分析 | Nashik Apartment Price Analyze – 語法解析(上)

  這次 Nashik 的房價分析有上傳至 Kaggle ,有興趣的朋友可以前往閱覽, RMarkdown PDF 報告存放在 Google 雲端,程式碼則是存放於 Github ,照慣例會分享好用的函式語法,雖說基本的 Packages 與語法可能很多人都會完整的閱覽,但是實際...