最近在做需要用R語言做數據清洗的項目,在網上看再多的技巧與語法,都不如在項目中實戰學習的快,下面是我通過實戰得來的經驗。
判斷Rstudio是否卡死
很多時候,我們在運行R語言代碼時,即使只是運行框選的幾行代碼,也會運行很久。其實,除了觀察控制臺是否有>或者>閃爍,以及在終端用命令查看運行狀態之外,還可以觀察我們的右上角的運行內存,如果在運行的過程中,觀察其變化區間,如果在100M或以上,就算是正常,如果變化很少或基本不動,那就要考慮是否卡死了。(有時候Rstudio卡死并不會有提醒你重啟的彈窗)
warnings()
有時候,我們在運行代碼的過程中會看到控制臺彈出error或者warning,但代碼仍然能繼續運行;此時記得分辨其意思,不要盲目得忽視。有時候的確只是提示我們某些包的版本過低需要更新,或者是畫圖的代碼有問題,但不影響實際使用;但是有時候的warning,比如我們調用連接語法right_join或left_join時,如果對于識別拼接的列名或變量沒有做好預處理的話,很容易彈出warning,在控制臺打印warnings()的話,會看到比如“16564 of 'x' 匹配了 16 of 'y'”的警告,這個一般是因為有過多重復的列名,需要提前做去重的預處理。
數據類型
不同于其他語言,在控制臺打印數據類型時,我們往往能看到輸出不止一個,代表其擁有很多數據特性。對應的,用于篩選的語法,就顯得尤為重要。這不只是,會不會報錯的問題,更是關乎于發現問題的方向。比如,如果我們使用了其他類型的語法,而不是單純的語法使用方法的錯誤,有時報錯會顯示要篩選的列名或數據不在列表或數據框里,但你打印列名,卻又能看到其在里面。而這往往就是我們使用了錯誤的語法,導致代碼無法識別數據的結構,打不開數據,也就找不到對應的數據了。
當然,并不是說語法方法使用錯誤,就只會報錯提示我們去改了。這也是一個需要重視的問題,其危害往往藏在我們看不見,又尤為重要的地方。很多時候我們語法使用不妥當,是不會報錯的,相反,代碼依舊會運行,但是你會發現結果跟我們想的不一樣,這個時候可能就會把我們思考問題的方向帶偏,去思考是不是數據本身有問題了。比如,只是單純的根據時間篩選最早的值賦予base.cr,使用pull(value)和直接用mutate新建一個變量,看似前者更簡潔,算力節省更多,實際上,卻會因為其邏輯是遍歷每個數據去篩選,而后者則只是在某一行直接讀數據,每次處理的數據量不同,前者會讓代碼一直在跑,等待的時間很久。(特別的,如果在運行代碼時,沒有報錯,Rstudio也沒有卡死,但觀察運行內存變化在一個小區間內反復橫跳,這個時候要注意是否是因為篩選的語法選擇錯了)