iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 25
0
AI & Data

[Data Science系列]成為哥布林的那件事-非常粗(初)心者系列 第 25

[Data Science系列]利用R語言來管理sapply-買個武器好價格

在前幾篇我們使用lapply來設定耶蘭提爾王國的分佈
先前有提到過當我們使用了lapply所有的output也就是結果將一定會是list
list能將所有不同的資料類型存起來。但問題來了假設所有的資料都是同一種數值呢?
是否就不需要將數據再轉換成list了呢?
因此當我們為了將數值變成向量,我們就要運用unlist的功能來做資料轉換
以下就是之前資料的做法

耶蘭提爾王國 <- c("耶·蘭提爾", "卡恩村", "卡茲平原", "都武大森林", "八本指")

王國字元 <- lapply(耶蘭提爾王國, nchar)

str(王國字元)
List of 5
 $ : int 5
 $ : int 3
 $ : int 4
 $ : int 5
 $ : int 3

王國字元 
[[1]]
[1] 5

[[2]]
[1] 3

[[3]]
[1] 4

[[4]]
[1] 5

[[5]]
[1] 3

unlist(lapply(耶蘭提爾王國, nchar))
[1] 5 3 4 5 3

但是否有更快的方式來處理資料呢?
這時候我們就可以運用到lapply的兄弟sapply
當我們直接將數據帶入sapply裡面,名字將自動帶入
R也直接幫我們unlist了

sapply(耶蘭提爾王國, nchar)
 耶·蘭提爾     卡恩村   卡茲平原 都武大森林     八本指 
         5          3          4          5          3 

這邊要注意我們同樣也可以將names移除,而預設的是保留names
因此這邊可以用USE.NAMES = FALSE來輸入指令

sapply(耶蘭提爾王國, nchar, USE.NAMES = FALSE)
[1] 5 3 4 5 3

這邊有組武器購買數據清單,看來戰火是無法避免了
我們將數據做成list的方式

BOW <- c(20, 30, 25, 21, 28)
SWORD <- c(29, 38, 30, 33, 32)
SPEAR <- c(23, 20, 25, 21, 19)
ARMOR <- c(42, 50, 40, 44, 48)
POTION <- c(39, 35, 33, 37, 30)

price <- list(BOW, SWORD, SPEAR, ARMOR, POTION)
names(price) <- c("BOW", "SWORD", "SPEAR", "ARMOR", "POTION")

price
$`BOW`
[1] 20 30 25 21 28

$SWORD
[1] 29 38 30 33 32

$SPEAR
[1] 23 20 25 21 19

$ARMOR
[1] 42 50 40 44 48

$POTION
[1] 39 35 33 37 30

接著我們透過前面學的function函式來設定最便宜的價格及最貴的價格來做比較
最後再利用剛學到的sapply來帶入數據

extremes_price <- function(x) {
  c(min = min(x), max = max(x))
}

sapply(price, extremes_price)
    BOW SWORD SPEAR ARMOR POTION
min  20    29    19    40     30
max  30    38    25    50     39

我們將數據帶成了矩陣的模式了,資料也更容易辨識了


上一篇
[Data Science系列]利用R語言來管理兵器數量-
下一篇
[Data Science系列]利用R語言來做計算-各種簡單函式的用法
系列文
[Data Science系列]成為哥布林的那件事-非常粗(初)心者30

尚未有邦友留言

立即登入留言