#0301上課程式碼:

#資料(data)、值(valus)、變數(varible)、物件(object)

# R 是以物件導向為主的程式語言, 在R中每一樣 “東西”, 都可視為 “物件”(object), 
##一、R語言資料集合:
#1.向量(vector)
#2.清單(list)
#3.矩陣(matrix)
#4.陣列(array)
#5.因子(factor)
#6.資料框(dataframe)
# 資料分析基本上是 :產生資料物件、命名、使用函式對物件運算操作


#建立向量資料====
id <- c("001", "002","003","004", "005")
name <- c("superman", "batman", "spiderman", "wolverine", "wonderwoman")
height <- c(190, 188, 178, 150, 183)
weight <- c(102, 95, 76, 88, 59)
gender <- c("Male", "Male","Male","Male","Female")


#二、R 的最基本物件是向量====
# 向量是由包含相同 “模式” 的元素 (element) 組成,
# 向量物件的基本元素的類型(basic mode) 主要分成
# 六大向量(vector)類型

# 1.數值向量(numeric):包含 "integer", 整數型向量  與 "double", 倍精確度型向量。
# 2.整數向量(integer)
# 3.文字向量(character) 
# 4.邏輯值向量(logical)
# 5.日期向量(Date)
# 6.日期時間向量(POSIXct)


#用class()查詢資料類型====

class(name)
## [1] "character"
class(height)
## [1] "numeric"
class(gender)
## [1] "character"
class(id)   
## [1] "character"
class(height)
## [1] "numeric"
q <- height > 170
q
## [1]  TRUE  TRUE  TRUE FALSE  TRUE
class(q)
## [1] "logical"
#str()查看資料結構====
#summary()查看變數統計量
str(name)
##  chr [1:5] "superman" "batman" "spiderman" "wolverine" "wonderwoman"
str(height)
##  num [1:5] 190 188 178 150 183
#用[ ]取出向量資料
name
## [1] "superman"    "batman"      "spiderman"   "wolverine"   "wonderwoman"
name[2]
## [1] "batman"
name[3:5]
## [1] "spiderman"   "wolverine"   "wonderwoman"
name[-1]
## [1] "batman"      "spiderman"   "wolverine"   "wonderwoman"
name[-c(1,3,5)]
## [1] "batman"    "wolverine"
height
## [1] 190 188 178 150 183
height[height > 170]
## [1] 190 188 178 183
#將向量資料組合為data frame(數據框) 
heroes <- data.frame(id,gender, height, weight, name)
#顯示在console區
heroes
##    id gender height weight        name
## 1 001   Male    190    102    superman
## 2 002   Male    188     95      batman
## 3 003   Male    178     76   spiderman
## 4 004   Male    150     88   wolverine
## 5 005 Female    183     59 wonderwoman
#看資料結構
str(heroes)
## 'data.frame':    5 obs. of  5 variables:
##  $ id    : chr  "001" "002" "003" "004" ...
##  $ gender: chr  "Male" "Male" "Male" "Male" ...
##  $ height: num  190 188 178 150 183
##  $ weight: num  102 95 76 88 59
##  $ name  : chr  "superman" "batman" "spiderman" "wolverine" ...
#看摘要
summary(heroes)
##       id               gender              height          weight   
##  Length:5           Length:5           Min.   :150.0   Min.   : 59  
##  Class :character   Class :character   1st Qu.:178.0   1st Qu.: 76  
##  Mode  :character   Mode  :character   Median :183.0   Median : 88  
##                                        Mean   :177.8   Mean   : 84  
##                                        3rd Qu.:188.0   3rd Qu.: 95  
##                                        Max.   :190.0   Max.   :102  
##      name          
##  Length:5          
##  Class :character  
##  Mode  :character  
##                    
##                    
## 
##存成.RData格式====
save(heroes, file = "heroes.RData")#請填入"heroes.RData"
#清空物件,然後再讀取一次.RData
load("heroes.RData")

###用[ ] 取出data frame中的資料, 其中[ 列, 欄]====
heroes[2, ]#取出第二列資料
##    id gender height weight   name
## 2 002   Male    188     95 batman
heroes[,2]#取出第二欄資料
## [1] "Male"   "Male"   "Male"   "Male"   "Female"
heroes[5, ]##取出第五列
##    id gender height weight        name
## 5 005 Female    183     59 wonderwoman
heroes[3,4]##取出第三列第四欄資料
## [1] 76
#用欄位名稱取出某欄的資料,有兩種方法:
heroes[["name"]]
## [1] "superman"    "batman"      "spiderman"   "wolverine"   "wonderwoman"
##或是
heroes$name
## [1] "superman"    "batman"      "spiderman"   "wolverine"   "wonderwoman"
heroes$height
## [1] 190 188 178 150 183
mean(heroes$height)
## [1] 177.8
heroes[1:3,]
##    id gender height weight      name
## 1 001   Male    190    102  superman
## 2 002   Male    188     95    batman
## 3 003   Male    178     76 spiderman
heroes[heroes$name=="spiderman",]#找出名字為"spiderman"的所有資料
##    id gender height weight      name
## 3 003   Male    178     76 spiderman
heroes[heroes$name!="spiderman",]#找出除了"spiderman"以外的所有資料
##    id gender height weight        name
## 1 001   Male    190    102    superman
## 2 002   Male    188     95      batman
## 4 004   Male    150     88   wolverine
## 5 005 Female    183     59 wonderwoman
heroes[heroes$height>180,]#找出身高大於180的所有資料
##    id gender height weight        name
## 1 001   Male    190    102    superman
## 2 002   Male    188     95      batman
## 5 005 Female    183     59 wonderwoman
heroes$height
## [1] 190 188 178 150 183
sort(heroes$height)#排序由小到大
## [1] 150 178 183 188 190
sort(heroes$height, decreasing = T)#排序由大到小
## [1] 190 188 183 178 150
#畫圖一
barplot(sort(heroes$height, decreasing = T))

#畫圖二
barplot(sort(heroes$height, decreasing = T),#要畫圖的向量資料
        main = "Heroes", #大標題
        sub = "by Peter Liu", #次標題
        names.arg =  c("superman", "batman", "spiderman", "wonderwoman", "wolverine"), #資料名稱
        xlab = "name", #x軸標籤
        ylab = "height", #y軸標籤
        col = c(6:10))#使用內建第6至10號顏色, colors(查詢R內建顏色)

# 亞洲四小龍(Four Asian Tigers)====
# https://zh.wikipedia.org/wiki/%E4%BA%9A%E6%B4%B2%E5%9B%9B%E5%B0%8F%E9%BE%99
#建立資料
nation <- c("Singapore","Hong kong","Korea","Taiwan")
growth <- c(0.36,0.28,0.83,1.40)
#合併nation和growth為data frame
data <- data.frame(nation,growth)
#畫長條圖
barplot(sort(data$growth, decreasing = TRUE),
        main = "Four Asian Tigers",#大標題
        sub = "by Peter Liu", #次標題
        names.arg =  c("Singapore","Hong kong","Korea","Taiwan"), #資料名稱
        xlab = "Nations",
        ylab = "Nations Population Growth",
        col = c(11:14))#第6至10號顏色, colors(查詢R內建顏色)

###資料組合與切割====

df <- iris
#檢視資料
#查看完整資料

#查看資料結構
str(df)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
#查看資料摘要
summary(df)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 
#查看資料欄位名稱
names(df)
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"
#查看第三欄,第1到10筆資料
df[1:10,3]
##  [1] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5
#查看欄位名稱為(Species)的資料
df$Species
##   [1] setosa     setosa     setosa     setosa     setosa     setosa    
##   [7] setosa     setosa     setosa     setosa     setosa     setosa    
##  [13] setosa     setosa     setosa     setosa     setosa     setosa    
##  [19] setosa     setosa     setosa     setosa     setosa     setosa    
##  [25] setosa     setosa     setosa     setosa     setosa     setosa    
##  [31] setosa     setosa     setosa     setosa     setosa     setosa    
##  [37] setosa     setosa     setosa     setosa     setosa     setosa    
##  [43] setosa     setosa     setosa     setosa     setosa     setosa    
##  [49] setosa     setosa     versicolor versicolor versicolor versicolor
##  [55] versicolor versicolor versicolor versicolor versicolor versicolor
##  [61] versicolor versicolor versicolor versicolor versicolor versicolor
##  [67] versicolor versicolor versicolor versicolor versicolor versicolor
##  [73] versicolor versicolor versicolor versicolor versicolor versicolor
##  [79] versicolor versicolor versicolor versicolor versicolor versicolor
##  [85] versicolor versicolor versicolor versicolor versicolor versicolor
##  [91] versicolor versicolor versicolor versicolor versicolor versicolor
##  [97] versicolor versicolor versicolor versicolor virginica  virginica 
## [103] virginica  virginica  virginica  virginica  virginica  virginica 
## [109] virginica  virginica  virginica  virginica  virginica  virginica 
## [115] virginica  virginica  virginica  virginica  virginica  virginica 
## [121] virginica  virginica  virginica  virginica  virginica  virginica 
## [127] virginica  virginica  virginica  virginica  virginica  virginica 
## [133] virginica  virginica  virginica  virginica  virginica  virginica 
## [139] virginica  virginica  virginica  virginica  virginica  virginica 
## [145] virginica  virginica  virginica  virginica  virginica  virginica 
## Levels: setosa versicolor virginica
#修改欄位名稱, 請填入"花萼長", "花萼寬", "花瓣長", "花瓣寬", "品種")
names(df) <-c("花萼長", "花萼寬", "花瓣長", "花瓣寬", "品種")
#找出"花萼長"大於等於7的所有資料
df[df$花萼長>7,]
##     花萼長 花萼寬 花瓣長 花瓣寬      品種
## 103    7.1    3.0    5.9    2.1 virginica
## 106    7.6    3.0    6.6    2.1 virginica
## 108    7.3    2.9    6.3    1.8 virginica
## 110    7.2    3.6    6.1    2.5 virginica
## 118    7.7    3.8    6.7    2.2 virginica
## 119    7.7    2.6    6.9    2.3 virginica
## 123    7.7    2.8    6.7    2.0 virginica
## 126    7.2    3.2    6.0    1.8 virginica
## 130    7.2    3.0    5.8    1.6 virginica
## 131    7.4    2.8    6.1    1.9 virginica
## 132    7.9    3.8    6.4    2.0 virginica
## 136    7.7    3.0    6.1    2.3 virginica
#計算"花萼長"大於等於7的資料有幾筆?
nrow(df[df$花萼長>7,])
## [1] 12
#查看「品種」欄位為setosa資料
df[df$品種=="setosa",]
##    花萼長 花萼寬 花瓣長 花瓣寬   品種
## 1     5.1    3.5    1.4    0.2 setosa
## 2     4.9    3.0    1.4    0.2 setosa
## 3     4.7    3.2    1.3    0.2 setosa
## 4     4.6    3.1    1.5    0.2 setosa
## 5     5.0    3.6    1.4    0.2 setosa
## 6     5.4    3.9    1.7    0.4 setosa
## 7     4.6    3.4    1.4    0.3 setosa
## 8     5.0    3.4    1.5    0.2 setosa
## 9     4.4    2.9    1.4    0.2 setosa
## 10    4.9    3.1    1.5    0.1 setosa
## 11    5.4    3.7    1.5    0.2 setosa
## 12    4.8    3.4    1.6    0.2 setosa
## 13    4.8    3.0    1.4    0.1 setosa
## 14    4.3    3.0    1.1    0.1 setosa
## 15    5.8    4.0    1.2    0.2 setosa
## 16    5.7    4.4    1.5    0.4 setosa
## 17    5.4    3.9    1.3    0.4 setosa
## 18    5.1    3.5    1.4    0.3 setosa
## 19    5.7    3.8    1.7    0.3 setosa
## 20    5.1    3.8    1.5    0.3 setosa
## 21    5.4    3.4    1.7    0.2 setosa
## 22    5.1    3.7    1.5    0.4 setosa
## 23    4.6    3.6    1.0    0.2 setosa
## 24    5.1    3.3    1.7    0.5 setosa
## 25    4.8    3.4    1.9    0.2 setosa
## 26    5.0    3.0    1.6    0.2 setosa
## 27    5.0    3.4    1.6    0.4 setosa
## 28    5.2    3.5    1.5    0.2 setosa
## 29    5.2    3.4    1.4    0.2 setosa
## 30    4.7    3.2    1.6    0.2 setosa
## 31    4.8    3.1    1.6    0.2 setosa
## 32    5.4    3.4    1.5    0.4 setosa
## 33    5.2    4.1    1.5    0.1 setosa
## 34    5.5    4.2    1.4    0.2 setosa
## 35    4.9    3.1    1.5    0.2 setosa
## 36    5.0    3.2    1.2    0.2 setosa
## 37    5.5    3.5    1.3    0.2 setosa
## 38    4.9    3.6    1.4    0.1 setosa
## 39    4.4    3.0    1.3    0.2 setosa
## 40    5.1    3.4    1.5    0.2 setosa
## 41    5.0    3.5    1.3    0.3 setosa
## 42    4.5    2.3    1.3    0.3 setosa
## 43    4.4    3.2    1.3    0.2 setosa
## 44    5.0    3.5    1.6    0.6 setosa
## 45    5.1    3.8    1.9    0.4 setosa
## 46    4.8    3.0    1.4    0.3 setosa
## 47    5.1    3.8    1.6    0.2 setosa
## 48    4.6    3.2    1.4    0.2 setosa
## 49    5.3    3.7    1.5    0.2 setosa
## 50    5.0    3.3    1.4    0.2 setosa
#將[品種]欄位中為setosa資料,另存成一個物件(df_setosa),
df_setosa <- df[df$品種=="setosa",]
#將物件(df_setosa)另存為.RData格式
save(df_setosa, file = "df_setosa.RData")


#測驗====
#讀取heroes_stats.RData
load("heroes_stats.RData")
#檢視資料
#查看完整資料

#查看資料結構
str(heroes_stats)
## Classes 'spec_tbl_df', 'tbl_df', 'tbl' and 'data.frame': 296 obs. of  9 variables:
##  $ 姓名: chr  "3-D Man" "A-Bomb" "Abe Sapien" "Abin Sur" ...
##  $ 陣營: Factor w/ 3 levels "bad","good","neutral": 2 2 2 2 2 2 2 2 2 2 ...
##  $ 智力: num  50 38 88 50 63 10 75 63 63 63 ...
##  $ 體力: num  31 100 14 90 10 8 28 80 10 13 ...
##  $ 速度: num  43 17 35 53 12 13 38 23 17 46 ...
##  $ 耐力: num  32 80 42 64 100 5 80 90 10 64 ...
##  $ 力量: num  25 17 35 84 71 5 72 98 7 17 ...
##  $ 戰鬥: num  52 64 85 65 64 20 95 32 55 42 ...
##  $ 總和: num  233 316 299 406 320 61 388 386 162 245 ...
##  - attr(*, "spec")=List of 3
##   ..$ cols   :List of 9
##   .. ..$ Name        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ Alignment   : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ Intelligence: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ Strength    : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ Speed       : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ Durability  : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ Power       : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ Combat      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ Total       : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   ..$ default: list()
##   .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
##   ..$ delim  : chr ","
##   ..- attr(*, "class")= chr "col_spec"
##  - attr(*, "problems")=<externalptr>
#查看資料摘要
summary(heroes_stats)
##      姓名                陣營          智力             體力       
##  Length:296         bad    :  0   Min.   :  6.00   Min.   :  4.00  
##  Class :character   good   :296   1st Qu.: 50.00   1st Qu.: 10.00  
##  Mode  :character   neutral:  0   Median : 63.00   Median : 28.00  
##                                   Mean   : 60.65   Mean   : 38.36  
##                                   3rd Qu.: 75.00   3rd Qu.: 67.75  
##                                   Max.   :100.00   Max.   :100.00  
##       速度             耐力             力量             戰鬥       
##  Min.   :  8.00   Min.   :  5.00   Min.   :  5.00   Min.   :  6.00  
##  1st Qu.: 23.00   1st Qu.: 28.00   1st Qu.: 32.75   1st Qu.: 42.00  
##  Median : 33.00   Median : 56.00   Median : 56.50   Median : 64.00  
##  Mean   : 38.45   Mean   : 56.86   Mean   : 55.66   Mean   : 60.61  
##  3rd Qu.: 50.00   3rd Qu.: 84.25   3rd Qu.: 73.25   3rd Qu.: 80.00  
##  Max.   :100.00   Max.   :110.00   Max.   :100.00   Max.   :101.00  
##       總和      
##  Min.   : 61.0  
##  1st Qu.:238.0  
##  Median :305.5  
##  Mean   :310.6  
##  3rd Qu.:374.0  
##  Max.   :581.0
#查看資料欄位名稱
names(heroes_stats)
## [1] "姓名" "陣營" "智力" "體力" "速度" "耐力" "力量" "戰鬥" "總和"
#查看第一、二、九欄,第1到5筆資料
heroes_stats[1:5,c(1,2,9)]
##          姓名 陣營 總和
## 1     3-D Man good  233
## 2      A-Bomb good  316
## 3  Abe Sapien good  299
## 4    Abin Sur good  406
## 7 Adam Monroe good  320
#查看欄位名稱為Alignment的資料
heroes_stats$Alignment
## NULL
#找出"Power"大於95的所有資料
heroes_stats[heroes_stats$Power>95,]
## [1] 姓名 陣營 智力 體力 速度 耐力 力量 戰鬥 總和
## <0 rows> (or 0-length row.names)
#計算""Power"大於95的的資料有幾筆?
nrow(heroes_stats[heroes_stats$Power>95,])
## [1] 0
#修改欄位名稱為中文
names(heroes_stats) <-c("姓名", "陣營", "智力", "體力", "速度","耐力","力量","戰鬥","總和")
#查看欄位名稱為Alignment的資料
heroes_stats$陣營
##   [1] good good good good good good good good good good good good good good good
##  [16] good good good good good good good good good good good good good good good
##  [31] good good good good good good good good good good good good good good good
##  [46] good good good good good good good good good good good good good good good
##  [61] good good good good good good good good good good good good good good good
##  [76] good good good good good good good good good good good good good good good
##  [91] good good good good good good good good good good good good good good good
## [106] good good good good good good good good good good good good good good good
## [121] good good good good good good good good good good good good good good good
## [136] good good good good good good good good good good good good good good good
## [151] good good good good good good good good good good good good good good good
## [166] good good good good good good good good good good good good good good good
## [181] good good good good good good good good good good good good good good good
## [196] good good good good good good good good good good good good good good good
## [211] good good good good good good good good good good good good good good good
## [226] good good good good good good good good good good good good good good good
## [241] good good good good good good good good good good good good good good good
## [256] good good good good good good good good good good good good good good good
## [271] good good good good good good good good good good good good good good good
## [286] good good good good good good good good good good good
## Levels: bad good neutral
#查看[Alignment]欄位中為good資料
heroes_stats <- heroes_stats[heroes_stats$陣營=="good",]
#將[Alignment]欄位中為good資料,另存成一個物件(heroes_good),
heroes_stats<- heroes_stats[heroes_stats$陣營=="good",]
#將物件(heroes_good)另存為.RData格式
save(heroes_stats, file = "heroes_stats.RData")
#[Name]欄位中有"man"的hero

#請選擇五個超級英雄,以長條圖呈現他們的綜合能力值(Total)
five_heros<-c(579,492,465,446,420)
barplot(five_heros,#要畫圖的向量資料
        main = "five_Heroes", #大標題
        names.arg =  c("superman", "Iron Man", "X-Man", "Wonder Man", "Spider-Man"), #資料名稱
        xlab = "name", #x軸標籤
        ylab = "total", #y軸標籤
        col = c(6:10))#使用內建第6至10號顏色, colors(查詢R內建顏色)