歡迎關注天善智能,我們是專注於商業智能BI,人工智能AI,大數據分析與挖掘領域的垂直社區,學習,問答、求職一站式搞定!
對商業智能BI、大數據分析挖掘、機器學習,python,R等數據領域感興趣的同學加微信:tstoutiao,邀請你進入數據愛好者交流羣,數據愛好者們都在這兒。
作者:村長,數據科學、指彈吉他及錄音工程愛好者,浙大金融學博士在讀,在data.table包和MongoDB的使用上有較多經驗。
寫在前面
本期我們大貓二人組的村長在新的一年首先回歸,爲大家帶來新的推送。
在本期,我們會運用一個病例數據爲大家進行講解示範,這也是大貓課堂第一次針對閱讀者提問進行的反饋,也希望大家能提供一些有趣的問題,來和我們一起分享,同時也感謝讀者孤鶩惜秋,與我們分享其問題。話不多說,馬上進入正題。
問題提出
在data.table語句中,i是用來進行行選擇的重要組成部分,很多情況下我們都需要以很多列的同一個特殊值進行行的選擇,大多數情況下,我們可能會針對所有的變量逐一寫出條件,例如a==1&b==1&c==1....但這樣的表達式很多時候並不方便和簡潔,有時甚至會出現許多問題。首先來看看下面這個數據:
這是一個病例數據,包含多個患者的診斷的時間,以及多個診斷的結果,在這裏讀者便提出,需要在所有這些診斷結果裏面篩選出所有出現過醛固酮,但不包括繼發性醛固酮的所有行。在這裏如果對每一個條件進行輸入,需要輸入20多個變量的判定,而且這裏的變量名非常的髒,不利於變量名的輸入。我們先把這一行代碼優雅的放上來(PS:在運行這一行代碼前我們已經對數據進行了適當清洗,批量生成了22個帶'_xtrct'後綴的變量,觀察值是醛固酮、繼發性醛固酮或者無,但這部分批量生成的代碼不作爲這次講解的內容, 會在以後的公衆號推送中爲大家講解):
clinic <- clinic[rowMeans(clinic[, 31:52] == "醛固酮") > 0 & rowMeans(clinic[, 31:52] != "繼發性醛固酮") == 1]
我們再來看看結果:
結果非常出色,不過大家看到這一段語句是不是有點懵,不用着急,待小編慢慢講解。
代碼解讀
裏層代碼
我們先從最裏面的一層代碼開始, 首先來看下面一段代碼的運行結果:
clinic[, 31:52] == "醛固酮"
從運行結果可以看出這是一個logic結果判定矩陣,裏面主要判定這個矩陣裏面是否是醛固酮, 如果是返回TRUE,如果不是返回FALSE,同理於代碼:
clinic[, 31:52] != "繼發性醛固酮"
判定是否觀察值裏面是否是繼發性醛固酮,如果不是返回TRUE,如果是返回FALSE。
外層代碼
下面來看外層代碼:
rowMeans(clinic[, 31:52] == "醛固酮") > 0
這裏運用了R語言中非常關鍵的一個知識點:對邏輯判斷值進行四則運算時,TRUE會被當做1,FALSE會被當做0, 這一點在這裏非常重要!!!!
那麼在這裏求每一行的均值,只要出現了醛固酮,那就會至少出現一個TRUE,那麼行的均值就肯定大於零,所以就將出現了醛固酮的行全都標記出來了,同理可得下面這行代碼:
rowMeans(clinic[, 31:52] != "繼發性醛固酮") == 1
標記出了所有沒有出現繼發性醛固酮的行。
這樣我們把這兩個條件合併在一起,然後配套上data.table的語句,就成了我們一開始出現的那條代碼:
clinic <- clinic[rowMeans(clinic[, 31:52] == "醛固酮") > 0 & rowMeans(clinic[, 31:52] != "繼發性醛固酮") == 1]
寫在結尾
應用好對象格式是R語言編程中的精髓之一,在這個例子中就很好的利用了對象格式裏面的格式性質,做了一些適當的變通處理,讓數據處理過程變得更加巧妙和方便,這點大家可以在以後的數據處理中做更多的嘗試和思考!
下期預告
下一期我們將講述在這一次數據處理中遇到的另外一個問題,問題的內容已經在前文中說明。祝大家開工大吉!
轉載自公衆號:大貓的R語言課堂
往期精彩:
關於data.table中i, j, by都爲數字的理解
公衆號後臺回覆關鍵字即可學習
回覆 爬蟲 爬蟲三大案例實戰
回覆 Python 1小時破冰入門
回覆 數據挖掘 R語言入門及數據挖掘
回覆 人工智能 三個月入門人工智能
回覆 數據分析師 數據分析師成長之路
回覆 機器學習 機器學習的商業應用
回覆 數據科學 數據科學實戰
回覆 常用算法 常用數據挖掘算法