第14 天:資料處理技巧· 輕鬆學習R 語言

文章推薦指數: 80 %
投票人數:10人

新增與刪除一個變數. 新增一個變數. 直接將新的向量指派給既有的資料框: > team_name wins iris[1,5] [1]setosa Levels:setosaversicolorvirginica >iris[1,"Species"] [1]setosa Levels:setosaversicolorvirginica 解構為向量 取出內建資料集iris的某一個變數: >iris$Sepal.Length#亦可以寫作iris[,"Sepal.Length"] [1]5.14.94.74.65.05.44.65.04.44.95.44.84.84.35.85.75.45.15.7 [20]5.15.45.14.65.14.85.05.05.25.24.74.85.45.25.54.95.05.54.9 [39]4.45.15.04.54.45.05.14.85.14.65.35.07.06.46.95.56.55.76.3 [58]4.96.65.25.05.96.06.15.66.75.65.86.25.65.96.16.36.16.46.6 [77]6.86.76.05.75.55.55.86.05.46.06.76.35.65.55.56.15.85.05.6 [96]5.75.76.25.15.76.35.87.16.36.57.64.97.36.77.26.56.46.85.7 [115]5.86.46.57.77.76.06.95.67.76.36.77.26.26.16.47.27.47.96.4 [134]6.36.17.76.36.46.06.96.76.95.86.86.76.76.36.56.25.9 我們可以清楚地發現,取出單一個變數後的資料結構就是向量,我們回憶一下使用data.frame()函數建立資料框的過程,是否也同樣是輸入數個向量然後結合成為一個資料框呢? >#輸入5個向量結合成為一個有5個變數的資料框 >team_namewinslossesis_championseason >great_nba_teamsiris[1:6,c("Sepal.Length","Petal.Length","Species")] Sepal.LengthPetal.LengthSpecies 15.11.4setosa 24.91.4setosa 34.71.3setosa 44.61.5setosa 55.01.4setosa 65.41.7setosa 或者利用邏輯值判斷選擇部分的資料框,這也是實務上較常使用的方式: >iris[iris$Petal.Length>=6,c("Sepal.Length","Petal.Length","Species")] Sepal.LengthPetal.LengthSpecies 1016.36.0virginica 1067.66.6virginica 1087.36.3virginica 1107.26.1virginica 1187.76.7virginica 1197.76.9virginica 1237.76.7virginica 1267.26.0virginica 1317.46.1virginica 1327.96.4virginica 1367.76.1virginica 假如我們希望使用更多的邏輯值判斷,可以使用&(and)或者|(or)這樣的運算子連結判斷條件: >filter=6)&(iris$Sepal.Length>=7.5) >iris[filter,c("Sepal.Length","Petal.Length","Species")] Sepal.LengthPetal.LengthSpecies 1067.66.6virginica 1187.76.7virginica 1197.76.9virginica 1237.76.7virginica 1327.96.4virginica 1367.76.1virginica 在這裡很多的R語言使用者,特別是有其他程式語言編寫經驗的就會問一個問題:&與&&或者說|與||的差別是什麼呢? 在R語言中連結兩個單變數的判斷條件,我們使用&&與||: >8>7&&8<7 [1]FALSE >8>7||8<7 [1]TRUE 假如是連結多個變數(例如向量)判斷條件,我們使用&與|: >c(8,8)>c(7,7)&c(8,8)c(8,8)>c(7,7)|c(8,8)8>7&8<7 [1]FALSE >8>7|8<7 [1]TRUE 然而在連結多個變數判斷條件時若使用&&與||,就只會納入第一個索引值的元素做判斷,這就不是我們要的結果: >c(8,8)>c(7,7)&&c(8,8)c(8,8)>c(7,7)||c(8,8)team_namewinslossesis_champion >#既有的資料框 >great_nba_teams >#新增一個變數 >seasongreat_nba_teams$seasongreat_nba_teams team_namewinslossesis_championseason 1ChicagoBulls7210TRUE1995-96 2GoldenStateWarriors739FALSE2015-16 新增一個衍生的變數 直接將計算後的向量指派給既有的資料框: >team_namewinslossesis_champion >#既有的資料框 >great_nba_teams >#新增一個衍生變數 >great_nba_teams$winning_percentagegreat_nba_teams team_namewinslossesis_championwinning_percentage 1ChicagoBulls7210TRUE0.8780488 2GoldenStateWarriors739FALSE0.8902439 刪除變數 將欲刪除的變數指派為NULL: >team_namewinslossesis_champion >#既有的資料框 >great_nba_teams >#刪除變數 >great_nba_teams$is_championgreat_nba_teams team_namewinslosses 1ChicagoBulls7210 2GoldenStateWarriors739 新增與刪除觀測值 新增觀測值 先將屬於因素向量的變數轉換回文字,再使用rbind()函數,這是為了防止新增因素向量的層級而造成錯誤: >team_namewinslossesis_championseason >#既有資料框,文字的變數被記錄為因素向量 >great_nba_teams >#新增觀測值 >lakers_7172great_nba_teamsteam_namewinslossesis_championseason >#既有資料框,選擇不要將文字變數記錄為因素向量 >great_nba_teams >#新增觀測值 >lakers_7172great_nba_teamsgreat_nba_teams team_namewinslossesis_championseason 1ChicagoBulls7210TRUE1995-96 2GoldenStateWarriors739FALSE2015-16 3LosAngelesLakers6913TRUE1971-72 刪除觀測值 與解構資料框的方式相同: >team_namewinslossesis_championseason >#既有資料框 >great_nba_teams >#刪除觀測值 >great_nba_teamsgreat_nba_teams team_namewinslossesis_championseason 1ChicagoBulls7210TRUE1995-96 重新命名變數 利用names()函數為資料框的變數重新命名: >team_namewinslossesis_championseason >#既有資料框 >great_nba_teams >#重新命名team_name為team >names(great_nba_teams)[1]great_nba_teams teamwinslossesis_championseason 1ChicagoBulls7210TRUE1995-96 2GoldenStateWarriors739FALSE2015-16 這個範例將team_name重新命名為team。

調整變數的位置 調整變數位置為:season、is_champion、wins、losses與team_name。

>team_namewinslossesis_championseason >#既有資料框 >great_nba_teams#調整變數的位置 >great_nba_teamsgreat_nba_teams seasonis_championwinslossesteam_name 11995-96TRUE7210ChicagoBulls 22015-16FALSE739GoldenStateWarriors 對類別變數重新編碼 將great_nba_teams$is_champion的邏輯值重新編碼為"Y"與"N": >team_namewinslossesis_championseason >#既有資料框 >great_nba_teams >#重新編碼 >great_nba_teams$is_champion[great_nba_teams$is_champion==TRUE]great_nba_teams$is_champion[great_nba_teams$is_champion==FALSE]great_nba_teams team_namewinslossesis_championseason 1ChicagoBulls7210Y1995-96 2GoldenStateWarriors739N2015-16 對數值變數重新編碼為類別變數 利用cut()函數將straw_hat_df$age的數值重新編碼為"20歲以下"、"超過20歲但30歲以下"與"超過30歲",cut()函數的參數設定稍微複雜一點,使用者必須要針對不同的類別指定切點breaks,舉例來說,要將年齡區分為三種類型,那麼我們必須要給定四個年齡切點(就像是植樹或者路燈問題!):c(0,20,30,Inf),其中Inf是R語言內建的無限大數值;以及給予三個類型標籤labels:c("20歲以下","超過20歲但30歲以下","超過30歲") >#既有的資料框 >nameagestraw_hat_df >#將straw_hat_df$age重新編碼 >straw_hat_df$age_categorystraw_hat_df nameageage_category 1蒙其·D·魯夫1920歲以下 2羅羅亞·索隆21超過20歲但30歲以下 3娜美2020歲以下 4騙人布1920歲以下 5賓什莫克·香吉士21超過20歲但30歲以下 6多尼多尼·喬巴1720歲以下 7妮可·羅賓30超過20歲但30歲以下 8佛朗基36超過30歲 9布魯克90超過30歲 合併資料框 垂直合併 垂直合併使用rbind()函數,rbind是rowbind的縮寫: >cars_uppercars_bottom >cars_combinedcars_leftcars_right >cars_combined#左邊的資料框 >nameageleft_df >#右邊的資料框 >namedevil_fruitright_df >#合併後的資料框 >merged_dfmerged_df nameagedevil_fruit 1多尼多尼·喬巴17人人果實 2蒙其·D·魯夫19橡膠果實 觀察合併後的資料框,我們可以發現只有左邊與右邊都有的兩個觀測值保留在最後的輸出,這是因為merge()函數預設是保留左右資料框的交集。

假如我們希望保留所有左邊資料框的觀測值,我們可以指定參數all.x=TRUE,那麼右邊資料框對應不到部分,就會以遺漏值NA呈現: >#左邊的資料框 >nameageleft_df >#右邊的資料框 >namedevil_fruitright_df >#合併後的資料框 >merged_dfmerged_df nameagedevil_fruit 1多尼多尼·喬巴17人人果實 2娜美20 3羅羅亞·索隆21 4蒙其·D·魯夫19橡膠果實 假如我們希望保留所有右邊資料框的觀測值,我們可以指定參數all.y=TRUE,那麼左邊資料框對應不到部分,就會以遺漏值NA呈現: >#左邊的資料框 >nameageleft_df >#右邊的資料框 >namedevil_fruitright_df >#合併後的資料框 >merged_dfmerged_df nameagedevil_fruit 1多尼多尼·喬巴17人人果實 2蒙其·D·魯夫19橡膠果實 3妮可·羅賓NA花花果實 假如我們希望保留兩邊資料框的觀測值,我們可以指定參數all.x=TRUE與all.y=TRUE,對應不到部分一樣會以遺漏值NA呈現: >#左邊的資料框 >nameageleft_df >#右邊的資料框 >namedevil_fruitright_df >#合併後的資料框 >merged_dfmerged_df nameagedevil_fruit 1多尼多尼·喬巴17人人果實 2娜美20 3羅羅亞·索隆21 4蒙其·D·魯夫19橡膠果實 5妮可·羅賓NA花花果實 前面的範例中,由於我們左邊與右邊資料框用來作為對照依據的變數都取名為name,所以merge()函數會自動辨認,但是當取名不同的時候,就會出現所謂的笛卡爾連接(CartesianJoin): >#左邊的資料框 >nameageleft_df >#右邊的資料框 >characterdevil_fruitright_df >#合併後的資料框 >merged_dfmerged_df nameagecharacterdevil_fruit 1蒙其·D·魯夫19蒙其·D·魯夫橡膠果實 2羅羅亞·索隆21蒙其·D·魯夫橡膠果實 3娜美20蒙其·D·魯夫橡膠果實 4多尼多尼·喬巴17蒙其·D·魯夫橡膠果實 5蒙其·D·魯夫19多尼多尼·喬巴人人果實 6羅羅亞·索隆21多尼多尼·喬巴人人果實 7娜美20多尼多尼·喬巴人人果實 8多尼多尼·喬巴17多尼多尼·喬巴人人果實 9蒙其·D·魯夫19妮可·羅賓花花果實 10羅羅亞·索隆21妮可·羅賓花花果實 11娜美20妮可·羅賓花花果實 12多尼多尼·喬巴17妮可·羅賓花花果實 這樣的結果很明顯不是我們想要的,這時只要加入by.x="name"與by.y="character"就可以解決: >#左邊的資料框 >nameageleft_df >#右邊的資料框 >characterdevil_fruitright_df >#合併後的資料框 >merged_dfmerged_df nameagedevil_fruit 1多尼多尼·喬巴17人人果實 2蒙其·D·魯夫19橡膠果實 小結 好啦!第十四天的內容就是這麼多,我們今天統整的是R語言常見的資料處理技巧,部分內容是我們早就嫻熟的技巧,相信您的掌握程度應該相當高! 練習題 在favorite_bands_df新增一個變數formed_years,這個變數以系統日期計算樂團成立幾週年。

favorite_bands_df



請為這篇文章評分?