Chapter 8 資料基本處理| R 資料科學與統計 - Bookdown

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

函式 group_by() 引數可放入類別變數, 然後分組進行相同資料分析. 以資料在檔案第5 章的survVATrial.csv 為例, 對試驗藥組與安慰劑組分別對 diagtime 計算計算平均 ... AMinimalBookExample Prerequisites 1R語言基本概論 1.1下載與安裝R 1.2下載與安裝RSudio 1.3簡單實例 1.4物件Object 1.5使用指令 1.6查詢顯示物件與刪除物件 1.7程式中止操作 1.8工作目錄 1.9程式編輯軟體與整合系統RStudio 1.10函式Function 1.11套件Packages 1.12解說與輔助文件 1.13地區語系與時區 2向量 2.1向量 2.2向量基本資料類型 2.3向量產生函式c() 2.4向量基本運算操作符號 2.5向量基本算數操作 2.6向量關係比較操作 2.7向量邏輯操作 2.8向量元素命名 2.9向量下標與索引Inxex 2.10遺失值(缺失值)MissingValues 2.11因子物件與類別變數Factor 3資料物件 3.1矩陣物件Matrix 3.1.1矩陣函式matrix() 3.1.2矩陣命名dimnames() 3.2矩陣的下標與索引MatrixIndex 3.3向量與矩陣的合併:rbind()與cbind() 3.4陣列物件Array 3.5列表物件List 3.5.1列表函式list() 3.5.2列表的下標與索引ListIndex 3.6資料框架DataFrame 3.7資料框架函式data.frame() 3.7.1資料框架的下標與索引DataFrameIndex 4資料輸入與輸出 4.1資料框架 4.2輸入外部ASCII資料檔案至R資料框架:空白分隔 4.3輸入外部ASCII資料檔案至R資料框架:逗號分隔 4.4R內建資料框架 4.5輸出{R}資料 4.6儲存{R}格式資料檔 5資料視覺化分析 5.1視覺化分析原則 5.2繪圖套件ggplot2 5.3類別變數 5.3.1單一類別變數 5.3.2多類別變數 5.4連續變數 5.4.1單連續變數 5.4.2二連續變數 5.4.3三連續變數 5.5混合變數 5.5.1一連續+一類別 5.5.2二連續+一類別 5.6分組繪圖 6基本函式 6.1函式語法 6.2檢視的函式原始碼定義 6.3數列函式 6.3.1數列函式:seq()與sequence() 6.4重複元素函式:rep() 6.5算數函式ArithmeticComputingFunction 6.6組合與階乘函式:choose()與factorial() 6.7選擇資料函式:all(),any(),which() 6.8排序函式RankingandSorting 6.9物件查看與強制轉換函式 7基本統計函式 7.1敘述統計函式 7.2類別資料表格函數 7.2.1列聯表函式:table(),xtabs() 7.2.2列聯表函式:ftable() 7.2.3列聯表函式:margin.table(),prop.table() 7.3機率函式與亂數生成函式 7.4隨機抽樣函式sample() 8資料基本處理 8.1資料輸入套件readr 8.2整潔資料TidyData 8.3Tibble與DataFrame 8.4資料流動管道運算指令Pipe 8.5資料檢視函式glimpse() 8.6資料處裡dplyr套件 8.6.1選擇個體函式filter() 8.6.2依據變數值排序函式arrange() 8.6.3選擇變數或欄位子集函式select() 8.6.4變數轉換函式mutate() 8.6.5向量if_else() 8.6.6變數重新命名rename() 8.6.7移除缺失資料drop_na() 8.6.8隨機抽樣函式sample_n()與sample_frac() 8.6.9選出明顯不同個體函式distinct()與n_distinct() 8.6.10利用橫列指標選出個體函式slice() 8.6.11計算常見統計量函式summarise() 8.6.12資料分組操作函式group_by() 8.6.13多變數計算統計量函式summarise_all() 8.7資料聯集與交集函式 8.8資料合併函式 9資料迭代處理 9.1對資料變數欄位(columns)進行相同操作 9.2對資料個體列位(rows)進行相同操作 9.3依據條件進行變數轉換 9.4{R}資料物件操作函式:apply() 10文字與字串資料處理 10.1文字與字串資料基礎 10.2套件stringr 10.3合併文字或字串str_c() 10.4取出文字或字串向量中的部分元素str_sub() 10.5語言設定地區與文字大小寫排序 10.6移除空白,加入空白,截斷文字str_trim()與str_pad() 10.7尋找特定形式文字或字串 10.7.1偵測函式str_detect() 10.7.2確認位置函式str_detect() 10.7.3確認索引函式str_subset()與str_which() 10.7.4取出函式str_extract() 10.7.5配對函式str_match() 10.7.6替代置換函式str_replace() 10.7.7分割函式str_split() 10.8群組尋找特定形式的文字與字串 10.9尋找連續重覆特定形式的文字與字串 10.10正規表示文字與字串(萬用字元) 11因子資料處理 11.1forcats套件:基本函式 11.2移除或增加部分類別水準 11.3改變類別水準函式 11.4改變或合併類別水準函式fct_lump() 11.5類別水準的頻率排序函式fct_infreq() 11.6依照其他變數將類別重新排序函式fct_reorder() 12日期時間處理 12.1lubridate套件的日期時間 12.1.1從文字或字串轉換創件日期時間物件 12.2從date-time資料個別成分,創件日期時間物件. 12.2.1從已經建立的其他資料物件創件日期時間物件 12.3時區轉換 12.4取出date-time資料的個別成分 12.5計算時間長度 12.5.1duration創建以秒計算的時間長度的物件 12.5.2period創建以人類文明的時間單位計算時間長度 12.5.3interval計算二個date-time物件之間的時間長度. 13統計與醫學 13.1醫學統計 13.2統計與數學 13.3醫學研究資料 13.4統計計算與統計軟體 14資料與變數 14.1醫學研究實例 14.2資料與變數DataandVariables 14.3變數分類 14.3.1統計與變數分類 14.3.2資料數位化與變數分類 14.4單變量,雙變量與多變量 14.5資料輸入與儲存 15Applications 15.1Exampleone 15.2Exampletwo 16FinalWords 17Temp References Publishedwithbookdown R資料科學與統計 Chapter8資料基本處理 tidyverse套件系統 包含許多不同套件, 提供資料科學一些實用的函式. 包含 tidyverse核心 ggplot2視覺化分析. purrr執行迴圈. tibble增強資料框架. dplyr資料處裡. tidyr精簡資料, stringr字串整理. readr資料輸入. forcats處理類別變數(factors). tidyverse套件系統的其他關聯套件包含 資料輸入import readxl輸入excel關聯檔案. haven輸入SPSS,Stata與SAS關聯檔案. jsonlite輸入JSON關聯檔案. xml2輸入XML關聯檔案. httr輸入webAPIs關聯檔案. rvest輸入webscraping關聯檔案. DBI輸入關聯資料庫,協同套件有RSQLite,RPostgres或odbc. 資料處理tidy/wrangle stringr處理字串. lubridate處理日期與時間. forcats處理類別變數(factors). hms處理日期與時間. blob處理二元資料儲存檔案. 程式寫作program rlang提供寫作核心語言與tidyverse. magrittr提供資料流動通道%>%. glue提供字串合併. 建模model broom處理建模結果. modelr偕同執行建模族. 8.1資料輸入套件readr tidyverse套件系統中的readr套件提供一些方便資料輸入的函式. 包含 read_csv()輸入.csv資料檔, read_excel輸入excel資料檔, read_delim()輸入不同分隔符號資料檔. 其中引數如下(help(read_delim)). read_delim( file, delim, quote="\"", escape_backslash=FALSE, escape_double=TRUE, col_names=TRUE, col_types=NULL, locale=default_locale(), na=c("","NA"), quoted_na=TRUE, comment="", trim_ws=FALSE, skip=0, n_max=Inf, guess_max=min(1000,n_max), progress=show_progress(), skip_empty_rows=TRUE ) file=路徑與檔名 delim=分隔符號 quote=視同分隔符號(資料的文字變數值常放在雙引號中) escape_backslash=預設FALSE,是否有逃脫符號 escape_double=預設TRUE,是否用引號符號作為逃脫符號 col_names=設定變數名(T或F) col_types=設定變數的類型 na=設定NA符號 comment=設定注釋符號,在注釋符號之後的文字不會被讀入 trim_ws=去除變數值得空白 skip=要跳過幾行(row)才開始讀入資料 n_max=最大輸入行數 糖尿病與人工關節術後感染臨床試驗(糖尿病與人工全膝關節置換手術研究) 退化性膝關節炎是人類關節疾病中最常見的一種, 主要病變的地方是膝關節的的關節軟骨受到傷害與磨損, 造成關節腔變窄以及產生骨刺,變化與年紀有高度相關. 年長者患有嚴重退化性膝關節炎,常須進行人工全膝關節置換手術(TKR), 但是若是術後感染,則有可能照造成截肢或因敗血症而死亡, 且糖尿病(DM)患者是此全膝關節置換手術後感染的高危險群. 因此一位骨科醫師進行一預防性臨床試驗, 對患有嚴重退化性膝關節炎的糖尿病患者, 隨機分配2組,一組在全膝關節置換手術中,使用的骨水泥內, 加入預防性抗生素藥劑,另一組為對照組. 研究的主要目的是探討全膝關節置換手術中, 在骨水泥內加入預防性抗生素藥劑,是否可以預防術後感染. 另外一個研究目的是在骨水泥內加入預防性抗生素藥劑, 研究共收集了78位病患的資料, 變數名稱列在表1. 資料檔案為DMTKRcsv.csv,DMTKAInfMo.csv, DMTKRtabsep.txt與DMTKRblanksep.txt. NO 病患辨識碼 AGE 年紀歲數(單位:年)(age) SEX 性別:0=F=女(female),1=M=男(Male). DM 糖尿病形態:0=TypeII(NIDDM);1=TypeI(IDDM) DMYR 手術前糖尿病病史(單位:年) PREAC 手術前空腹血糖(mg/dL) PREPC 手術前飯後血糖(mg/dL) POSTAC 手術後空腹血糖(mg/dL) POSTPC 手術後飯後血糖(mg/dL) MEDICATION 糖尿病治療方式: 0=口服降血糖藥劑;1=胰島素注射;2=飲食控制 SIDE 患側:0=左側;1=右側 PREKS 手術前膝功能分數 POSTKS 手術後膝功能分數 ABS 骨水泥是否加抗生素1=Yes;0=No INFECT 術後感染:0=No;1=Yes,發現術後感染 INFMO 發現術後感染的時間(單位:月) MISC 註記 Table1.糖尿病與人工關節術後感染臨床試驗:變數說明 #.csv library(tidyverse) ##Warning:package'tibble'wasbuiltunderRversion4.0.3 ##Warning:package'readr'wasbuiltunderRversion4.0.3 library(readr) dd ##11670010120160140180005692 ##22670011100150150220016262 ##3372104150200120150206094 ##4482108150200160250014790 ##557310385110140200004488 ##ABSINFECTINFMO ## ##1100 ##2012 ##3100 ##4100 ##5000 ###...with73morerows #.xls library(readxl) dd ##11670010120160140180005692 ##22670011100150150220016262 ##3372104150200120150206094 ##4482108150200160250014790 ##557310385110140200004488 ##ABSINFECTI0FECTMO ## ##1100 ##2012 ##3100 ##4100 ##5000 ###...with73morerows 8.2整潔資料TidyData 統計計算可以進行分析的資料, 通常有一個的簡單的基本架構, 在{R}稱作 資料框架 (dataframe). 資料框架是類似於在SAS,STATA等的dataset架構. 資料框架通常類似矩陣, 資料框架也類似矩形的 交叉列聯表 (crosstable), 稱為 資料表 (**datatable). 套件tidverse原始套件tidy`強調外部資料檔案必須符合 整潔資料**(tidydata)方便操作. 整潔資料的基本要求特徵是 每個變數各自形成1欄(縱行,row), 每個列(橫列,row)各自為一個觀測時間的測量. 例如,每位個體只有觀測一次, 則每個列為一位個體的觀測值. 若每位個體有多次觀測時間點, 則一位個體一次觀測時間點的觀測值為一列, 一位個體或有多列的觀測值. 一個整潔資料的資料表包含以下重點. 一個檔案只用一張資料表 一張資料表(EXCEL的sheet). 一個欄位(縱行,Column)只有一個變數,同時有清楚的變數名. 若完整資料包含不同資料表,則不同資料表要有索引(inxex)或指標變數(id)可進行關聯與串聯. TidyData:RforDataScience,Figure12.1 整潔資料指引主要提供研究者在輸入資料檔案時能夠遵循. 例如,一些者常將EXCEL一張sheel內混合著原始資料,分析結果與圖形. 也經常將二個變數放在同一個欄位,二個變數簡單以/分隔. 例如檔案DMTKAORI.xls. 若資料檔案不是整潔資料,則需浩費學多時間清理,甚至必須重新輸入到資料檔案. 8.3Tibble與DataFrame tidyverse系統中的readr套件輸入資料後, tidyverse會儲存成(tibble)資料物件, 成為tbl_df,tbl類型的資料物件, 主要是tidyverse系統會使用tibble套件進行操作. tibbles資料物件與原有資料框架data.frame物件有相同的屬性外, 另外多了些讓tidyverse系統容易操作的屬性. 對初學者而言,二者幾呼無任何差異. 若有{R}base函式無法操作tibble資料物件, 可使用as.data.frame() 轉成{R}base的data.frame物件. 同樣,若tidyverse系統函式無法操作的data.frame物件, 可用‵as_tibble()將data.frame物件轉成tibbles`資料物件. 以資料在檔案第5章的survVATrial.csv為例. ##dataframeobject dd%稱為pipe,管線,管道,導管. 此運算符號,可將函式與運算串聯, %>%左側通常是資料物件,資料框架,矩陣,向量等, %>%右側通常是函式fun_name(), 而%>%左側資料自動為函式fun_name()內的第一個引數. 在Unix/Linux系統的各種指令可以運用pipe的方式串連執行, magrittr套件提供類似的思維, 且資料流動從%>%左測的資料送到%>%右側的函式執行運算,可讓程式寫作符合文字書寫由左到右的思考邏輯.使用pipe`並不會改變程式的執行順序, 主要目的在於讓程式更容易寫作與閱讀, 降低程式寫作的錯誤與負擔. ##shortandclean log(mean(c(1:10))) ##[1]1.705 ##easilyread x% library(magrittr) c(1:10)%>%mean()%>%log() ##[1]1.705 8.5資料檢視函式glimpse() 資料輸入到{R}後, 必須先檢視資料內容,比對原始資料檔案是否正確讀入資料. 包含觀測值數目,變數數目, 那些變數為辨識指標, 變數屬性,那些變數為連續變數或類別變數, 類別變數屬性,名目變數或是順序變數, 整理類別變數的類別水準名稱. 每個變數的缺失數目與頻率, 每個個體的缺失數目與頻率. 以資料在檔案第5章的survVATrial.csv為例. dd=dd%>%as_tibble() print(dd,n=5,width=Inf) ###Atibble:137x8 ##treatcellcodetimecensordiagtimekpsageprior ## ##101721607690 ##20141117056410 ##3012281603380 ##40112616096310 ##501118170116510 ###...with132morerows 可以看到資料有137位個體,8個變數. 其中time,diagtime,kps,age為連續變數. treat,cellcode,censor,prior等為類別變數, 但類別變數以數字輸入,需先設定成為類別變數. 以資料在檔案第5章的survVATrial.csv為例. dd$treat ##1placebosquamous72dead60769no ##2placebosquamous411dead70564yes ##3placebosquamous228dead60338no ##4placebosquamous126dead60963yes ##5placebosquamous118dead701165yes ###...with132morerows tidyverse系統中的tibble套件提供一個檢視資料函式`glimpse(), 類似{R}base的str()函式. ##Rbase str(dd) ##tibble[137x8](S3:tbl_df/tbl/data.frame) ##$treat:Factorw/2levels"placebo","test":1111111111... ##$cellcode:Factorw/4levels"squamous","small",..:1111111111... ##$time:int[1:137]724112281261181082110314100... ##$censor:Factorw/2levels"survival","dead":2222222221... ##$diagtime:int[1:137]60706060702040805070... ##$kps:int[1:137]75391151029186... ##$age:int[1:137]69643863654969684370... ##$prior:Factorw/2levels"no","yes":1212212111... ##glimpse() glimpse(dd) ##Rows:137 ##Columns:8 ##$treatplacebo,placebo,placebo,placebo,placebo,placebo,placebo,pla... ##$cellcodesquamous,squamous,squamous,squamous,squamous,squamous,squamo... ##$time72,411,228,126,118,10,82,110,314,100,42,8,144,25,11,... ##$censordead,dead,dead,dead,dead,dead,dead,dead,dead,survival,de... ##$diagtime60,70,60,60,70,20,40,80,50,70,60,40,30,80,70,60,60... ##$kps7,5,3,9,11,5,10,29,18,6,4,58,4,9,11,3,9,2,4,4,... ##$age69,64,38,63,65,49,69,68,43,70,81,63,63,52,48,61,42... ##$priorno,yes,no,yes,yes,no,yes,no,no,no,no,yes,no,yes,yes,... 8.6資料處裡dplyr套件 tidyverse系統中的資料處裡dplyr套件, 有一些資料資料處裡常用函式. %>%=pipe指令 rename()=變數(column)重新命名 filter()=選擇個體或行位子集(rows) arrange()=依據變數值排序 select()=選擇變數(variables)或欄位子集(columns) mutate()=變數轉換 sample_n()與sample_frac()=隨機抽樣函式 distinct()與n_distinct()=選出明顯不同個體 slice()=利用橫列指標(rowindex)選出個體(row) summarise()=計算常見統計量 group_by()=資料分組操作 這些函式的第1個引數為資料物件, 後續只用為變數名(不加雙引號), 可以合併使用group_by()函式與%>%指令. 8.6.1選擇個體函式filter() 資料常常需要依據納入與排除條件, 此時會依據變數值進行篩選. filter()函式可協助選擇個體. 以資料在檔案第5章的survVATrial.csv為例, 選擇個體treat為placebo,cellcode為large. ##filter() dd.a% filter(treat=='placebo',cellcode=='large') dd.a ###Atibble:15x8 ##treatcellcodetimecensordiagtimekpsageprior ## ##1placebolarge177dead501666yes ##2placebolarge162dead80562no ##3placebolarge216dead501552no ##4placebolarge553dead70247no ##5placebolarge278dead601263no ##6placebolarge12dead401268yes ##7placebolarge260dead80545no ##8placebolarge200dead801241yes ##9placebolarge156dead70266no ##10placebolarge182survival90262no ##11placebolarge143dead90860no ##12placebolarge105dead801166no ##13placebolarge103dead80538no ##14placebolarge250dead70853yes ##15placebolarge100dead601337yes 選擇個體treat為試驗藥組,age大於50,kps小於或等於7 dd.b% filter(treat=='test',age>50,kps<=7) dd.b ###Atibble:35x8 ##treatcellcodetimecensordiagtimekpsageprior ## ##1testsquamous112dead80660no ##2testsquamous242dead50170no ##3testsquamous111dead70362no ##4testsquamous587dead60358no ##5testsquamous389dead90262no ##6testsquamous33dead30664no ##7testsquamous467dead90264no ##8testsquamous283dead90251no ##9testsmall25dead30269no ##10testsmall21dead20471no ###...with25morerows 8.6.2依據變數值排序函式arrange() 資料常常需要依據變數值排序, arrange()函式內設依照變數在函式出現順序以及變數值由小到大排序. 若要變數值從由大到小排序,可使用desc()函式. 例如,以資料在檔案第5章的survVATrial.csv為例, 依照age由小到大排序, time由大到小排序. 無論如何排序,缺失值總是排在最後, 這須與{R}base的order(),sort()或rank()進行比較. ##arrange() dd.s% arrange(age,desc(time)) dd.s ###Atibble:137x8 ##treatcellcodetimecensordiagtimekpsageprior ## ##1placeboadeno95dead80434no ##2placebosmall4dead40235no ##3testsquamous1dead50735no ##4testsmall103survival702236yes ##5placebolarge100dead601337yes ##6testlarge49dead30337no ##7placebosquamous228dead60338no ##8placeboadeno117dead80238no ##9placebolarge103dead80538no ##10testadeno31dead80339no ###...with127morerows 8.6.3選擇變數或欄位子集函式select() 面對大數據時,可能有成千上萬的變數, 但通常部不會使用到所有的變數, 選擇所需要的變數另組成分析子集, 可減少RAM的負擔並加速分析執行速度. 以資料在檔案第5章的survVATrial.csv為例, 選擇treat,cellcode,censor等變數. dd.c% select(treat,cellcode,censor) dd.c ###Atibble:137x3 ##treatcellcodecensor ## ##1placebosquamousdead ##2placebosquamousdead ##3placebosquamousdead ##4placebosquamousdead ##5placebosquamousdead ##6placebosquamousdead ##7placebosquamousdead ##8placebosquamousdead ##9placebosquamousdead ##10placebosquamoussurvival ###...with127morerows 8.6.4變數轉換函式mutate() 資料分析前常常需要變數進行轉換,例如取對數轉換, 標準化,也常將二個以上不同變數進行計算,轉換成新變數, 例如計算BMI(生體質量指數). 以資料在檔案第5章的survVATrial.csv為例, 對time取對數轉換,diagtime*age/100. ##mutate() dd.a% mutate( log_age=log(age), diag_age=diagtime*age/100 ) dd.a%>% select(age,diagtime,log_age,diag_age)%>% print(n=5,width=Inf) ###Atibble:137x4 ##agediagtimelog_agediag_age ## ##169604.2341.4 ##264704.1644.8 ##338603.6422.8 ##463604.1437.8 ##565704.1745.5 ###...with132morerows 8.6.5向量if_else() dplyr套件中的函式if_else()與{R}base函式ifelse()有類似功能, 執行特殊的變數轉換. if_else(condition,true,false,missing=NULL) 引數condition為邏輯向量, true與false為相同模式且相同長度的向量或相同模式的純量. 當condition=TRUE,則回傳true, 反之,當condition=FALSE,則回傳false. x0,1,0) ##[1]NA00011NA ##if_else if_else(x>0,1,0) ##[1]NA00011NA if_else(x<0,"negative","positive",missing="missingvalue") ##[1]"missingvalue""negative""negative""positive""positive" ##[6]"positive""missingvalue" if_else(is.na(x),1,0)%>%mean() ##[1]0.2857 8.6.6變數重新命名rename() dplyr套件中的函式rename()可將變數重新命名. rename(new_name=old_name) 以資料在檔案第5章的survVATrial.csv為例, 將變數treat重新命名為drug. ##original print(dd,n=5,width=Inf) ###Atibble:137x8 ##treatcellcodetimecensordiagtimekpsageprior ## ##1placebosquamous72dead60769no ##2placebosquamous411dead70564yes ##3placebosquamous228dead60338no ##4placebosquamous126dead60963yes ##5placebosquamous118dead701165yes ###...with132morerows ##change dd.new%rename(drug=treat) print(dd.new,n=5,width=Inf) ###Atibble:137x8 ##drugcellcodetimecensordiagtimekpsageprior ## ##1placebosquamous72dead60769no ##2placebosquamous411dead70564yes ##3placebosquamous228dead60338no ##4placebosquamous126dead60963yes ##5placebosquamous118dead701165yes ###...with132morerows 8.6.7移除缺失資料drop_na() tidyr套件中的函式drop_na()可將資料內具有缺失值得個體移除, 但這樣處理資料必須非常小心解讀. dd.mis ##130M ##240M ##3NAF ##460 dd.mis%>%drop_na() ###Atibble:2x2 ##agegender ## ##130M ##240M dd.mis%>%drop_na(age) ###Atibble:3x2 ##agegender ## ##130M ##240M ##360 dd.mis%>%drop_na(gender) ###Atibble:3x2 ##agegender ## ##130M ##240M ##3NAF 8.6.8隨機抽樣函式sample_n()與sample_frac() 函式sample_n()與sample_frac() 可以對資料進行隨機抽樣. 引數為 size=k設定所要抽出之樣本數或分率. weight抽取之相對應權重. 若無設定值,則每一個個體被抽取之相對應權重相等. replace=FALSE邏輯指令,設定是否可重複抽取. 以資料在檔案第5章的survVATrial.csv為例, 由資料抽樣5位個體. ##sample_n() set.seed(1) dd%>%sample_n(size=5,replace=FALSE) ###Atibble:5x8 ##treatcellcodetimecensordiagtimekpsageprior ## ##1placebolarge250dead70853yes ##2testlarge53dead601266no ##3placebosmall63dead501148no ##4placebosquamous25survival80952yes ##5placeboadeno12dead50463yes set.seed(10) dd%>%sample_n(size=5,replace=TRUE) ###Atibble:5x8 ##treatcellcodetimecensordiagtimekpsageprior ## ##1testlarge49dead30337no ##2testsquamous242dead50170no ##3testadeno51dead60562no ##4testsquamous87survival80348no ##5testsquamous283dead90251no set.seed(100) dd%>%sample_frac(size=0.1) ###Atibble:14x8 ##treatcellcodetimecensordiagtimekpsageprior ## ##1testsmall61dead70271no ##2testadeno51dead60562no ##3placebosquamous126dead60963yes ##4placebolarge177dead501666yes ##5testsquamous999dead901254yes ##6testsmall24dead60849no ##7placebosquamous82dead401069yes ##8placebosmall63dead501148no ##9placeboadeno12dead50463yes ##10testsquamous87survival80348no ##11placebosmall4dead40235no ##12placebosmall117dead80346no ##13placebosquamous411dead70564yes ##14testlarge53dead601266no 8.6.9選出明顯不同個體函式distinct()與n_distinct() 資料常常重覆輸入的個體,或是個體有重覆測量, distinct()函式可以查詢多少明顯不同的個體, 使用引數.keep_all=TRUE可以保留所有變數. 函式n_distinct()計算明顯不同的個體數目, 使用引數na.rm=FALSE決定是否納入缺失值. ##distinct() set.seed(1) df ##111 ##243 ##313 ##423 ##553 ##634 ##721 ##831 ##934 ##1012 ##1151 ##1252 ##1323 ##1424 ##1511 ##1653 ##1755 ##1813 ##1914 ##2052 ###...with80morerows nrow(df) ##[1]100 nrow(distinct(df)) ##[1]24 nrow(distinct(df,x,y)) ##[1]24 distinct(df,x) ###Atibble:5x1 ##x ## ##11 ##24 ##32 ##45 ##53 distinct(df,y) ###Atibble:5x1 ##y ## ##11 ##23 ##34 ##42 ##55 distinct(df,x,.keep_all=TRUE) ###Atibble:5x2 ##xy ## ##111 ##243 ##323 ##453 ##534 ## set.seed(1) df ##193 ##2410 ##373 ##411 ##526 ##676 ##724 ##839 ##915 ##1051 ###...with90morerows nrow(df) ##[1]100 nrow(distinct(df)) ##[1]65 nrow(distinct(df,x,y)) ##[1]65 distinct(df,x) ###Atibble:10x1 ##x ## ##19 ##24 ##37 ##41 ##52 ##63 ##75 ##810 ##96 ##108 distinct(df,y) ###Atibble:10x1 ##y ## ##13 ##210 ##31 ##46 ##54 ##69 ##75 ##87 ##92 ##108 distinct(df,x,.keep_all=TRUE) ###Atibble:10x2 ##xy ## ##193 ##2410 ##373 ##411 ##526 ##639 ##751 ##8106 ##963 ##1082 # set.seed(1) x%slice(1) ###Atibble:1x8 ##treatcellcodetimecensordiagtimekpsageprior ## ##1placebosquamous72dead60769no dd%>%slice(1:3) ###Atibble:3x8 ##treatcellcodetimecensordiagtimekpsageprior ## ##1placebosquamous72dead60769no ##2placebosquamous411dead70564yes ##3placebosquamous228dead60338no dd%>%slice(101:n()) ###Atibble:37x8 ##treatcellcodetimecensordiagtimekpsageprior ## ##1testsmall99dead85462no ##2testsmall61dead70271no ##3testsmall25dead70270no ##4testsmall95dead70161no ##5testsmall80dead501771no ##6testsmall51dead308759yes ##7testsmall29dead40867no ##8testadeno24dead40260no ##9testadeno18dead40569yes ##10testadeno83survival99357no ###...with27morerows dd%>%slice(-c(1:100)) ###Atibble:37x8 ##treatcellcodetimecensordiagtimekpsageprior ## ##1testsmall99dead85462no ##2testsmall61dead70271no ##3testsmall25dead70270no ##4testsmall95dead70161no ##5testsmall80dead501771no ##6testsmall51dead308759yes ##7testsmall29dead40867no ##8testadeno24dead40260no ##9testadeno18dead40569yes ##10testadeno83survival99357no ###...with27morerows dd%>%slice_head(n=3) ###Atibble:3x8 ##treatcellcodetimecensordiagtimekpsageprior ## ##1placebosquamous72dead60769no ##2placebosquamous411dead70564yes ##3placebosquamous228dead60338no dd%>%slice_tail(n=3) ###Atibble:3x8 ##treatcellcodetimecensordiagtimekpsageprior ## ##1testlarge231dead701867yes ##2testlarge378dead80465no ##3testlarge49dead30337no dd%>%slice_min(time,n=3) ###Atibble:3x8 ##treatcellcodetimecensordiagtimekpsageprior ## ##1testsquamous1dead202165yes ##2testsquamous1dead50735no ##3testsmall2dead403644yes dd%>%slice_max(time,n=3) ###Atibble:3x8 ##treatcellcodetimecensordiagtimekpsageprior ## ##1testsquamous999dead901254yes ##2testsquamous991dead70750yes ##3testsquamous587dead60358no set.seed(1) dd%>%slice_sample(n=3) ###Atibble:3x8 ##treatcellcodetimecensordiagtimekpsageprior ## ##1placebolarge250dead70853yes ##2testlarge53dead601266no ##3placebosmall63dead501148no 8.6.11計算常見統計量函式summarise() 資料分析常常需要變數基本統計量, 例如,計算個數,平均值,變異數等等. summarise()函式可計算常見統計量, 期常用引數有 Center:mean(),median() Spread:var(),sd(),IQR(),mad(),range() Range:min(),max(),quantile() Position:first(),last(),nth() Count:n(),n_distinct() Logical:any(),all() 以資料在檔案第5章的survVATrial.csv為例, 對資料計算個數n(), 對age計算平均值與標準差. ##summarise dd%>% summarise( count=n(), age_mean=mean(age,na.rm=TRUE), age_sd=sd(age,na.rm=TRUE) ) ###Atibble:1x3 ##countage_meanage_sd ## ##113758.310.5 8.6.12資料分組操作函式group_by() 資料分析常常需要類別變數分組,個別操作資料或進行計算統計量. 函式group_by()引數可放入類別變數,然後分組進行相同資料分析. 以資料在檔案第5章的survVATrial.csv為例, 對試驗藥組與安慰劑組分別對diagtime計算計算平均值與標準差.. ##group_by() dd%>% group_by(treat)%>% summarise( diagtime_mean=mean(diagtime,na.rm=TRUE), diagtime_sd=sd(diagtime,na.rm=TRUE) ) ###Atibble:2x3 ##treatdiagtime_meandiagtime_sd ## ##1placebo59.218.7 ##2test57.921.4 dd%>% group_by(treat,cellcode)%>% summarise( diagtime_mean=mean(diagtime,na.rm=TRUE), diagtime_sd=sd(diagtime,na.rm=TRUE) ) ###Atibble:8x4 ###Groups:treat[2] ##treatcellcodediagtime_meandiagtime_sd ## ##1placebosquamous57.317.9 ##2placebosmall54.817.7 ##3placeboadeno58.924.2 ##4placebolarge7015.1 ##5testsquamous63.522.3 ##6testsmall51.421.5 ##7testadeno57.721.7 ##8testlarge58.818.8 8.6.13多變數計算統計量函式summarise_all() summarise()函式只能分別對當一變數進行計算, 若要同時對許多變數進行相同操作, 可使用以下函式. summarise_all()對每一個變數進行相同操作 summarise_each()對每一個變數進行相同操作,需加變數名 summarise_at()對選出的變數進行相同操作需加變數名 summarise_if()對符合特定條件的變數進行相同操作 ##summarise_all() con.mean% select(time,diagtime,kps,age)%>% summarise_all(mean,na.rm=TRUE) con.mean ###Atibble:1x4 ##timediagtimekpsage ## ##1122.58.68.7758.3 # con.sd% select(time,diagtime,kps,age)%>% summarise_all(sd,na.rm=TRUE) con.sd ###Atibble:1x4 ##timediagtimekpsage ## ##1158.20.010.610.5 id%select(time,diagtime,kps,age)%>% summarise_all(list(mean,sd),na.rm=TRUE) ###Atibble:1x8 ##time_fn1diagtime_fn1kps_fn1age_fn1time_fn2diagtime_fn2kps_fn2age_fn2 ## ##1122.58.68.7758.3158.20.010.610.5 dd%>%select(time,diagtime,kps,age)%>% summarise_all(lst(mean,sd),na.rm=TRUE) ###Atibble:1x8 ##time_meandiagtime_meankps_meanage_meantime_sddiagtime_sdkps_sdage_sd ## ##1122.58.68.7758.3158.20.010.610.5 dd%>% summarise_each(list(mean,sd),time,age)#notsouseful ##Warning:`summarise_each_()`isdeprecatedasofdplyr0.7.0. ##Pleaseuse`across()`instead. ##Thiswarningisdisplayedonceevery8hours. ##Call`lifecycle::last_warnings()`toseewherethiswarningwasgenerated. ###Atibble:1x4 ##time_fn1age_fn1time_fn2age_fn2 ## ##1122.58.3158.10.5 dd%>% summarise_each(lst(mean,sd),time,age)#notsouseful ###Atibble:1x4 ##time_meanage_meantime_sdage_sd ##



請為這篇文章評分?