99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀入門 | 一小時(shí)向非程序員介紹 R 編程語言
入門 | 一小時(shí)向非程序員介紹 R 編程語言
2016-01-26
收藏

來源 | 伯樂在線
我妹妹正在念大四,主修社會(huì)學(xué)。她剛剛簽了下個(gè)學(xué)期一份不錯(cuò)的分析員工作,對方告訴她工作中要用到 R 編程語言。她讓我在寒假時(shí)教教她,我欣然同意了。還有什么比這更好的方式來消磨明尼蘇達(dá)的冬天呢?[注1]
問題是:在原定教她的那天,我們倆都有空的時(shí)間只有一個(gè)小時(shí)。哎呀!
不過我還是接受了這個(gè)挑戰(zhàn),用一個(gè)小時(shí)向我的社會(huì)學(xué)家妹妹介紹R。下面就是我所做的事情。我沒有預(yù)先做功課,而且肯定犯了些錯(cuò)誤,忽視了核心思想,糾纏于細(xì)枝末節(jié)。但妹妹給我的反饋是非常好(我確實(shí)對其他人的“一小時(shí)學(xué)會(huì)R”理念非常感興趣)
(1)下載R和RStudio
我對RStudio的印象不錯(cuò),對于初學(xué)者來說,它既方便又很有幫助,對專業(yè)人士也很有用。尤其對于初學(xué)者:鼠標(biāo)指向-點(diǎn)擊式(point-and-click)的選項(xiàng)非常棒,工作區(qū)面板對于建立起對R環(huán)境的概念也非常有用。我甚至都不用再花精力向我妹妹介紹R默認(rèn)的集成開發(fā)環(huán)境——我馬上就讓她下載了RStudio,不過你仍然需要下載普通版的R。下載之后,我意識到r-project.org網(wǎng)站真應(yīng)該在設(shè)計(jì)上進(jìn)行大修整,因?yàn)椋?a)它不夠漂亮(b)如果你不知道什么是“CRAN鏡像”,下載R將是一件容易把人搞糊涂的事。
(2)控制臺(tái)和腳本
準(zhǔn)備好之后,我們做的第一件事就是在控制臺(tái)中鍵入如下兩行代碼:

這并非純粹的“Hello World”,但它闡明了一些概念,比如”賦值”、”變量”和”求值”[注2]。
接著,我讓妹妹在一個(gè)R腳本文件中保存了上面那兩行代碼(我認(rèn)為,在初學(xué)者開始使用一門語言時(shí)就教會(huì)他們?nèi)绾握_地把代碼保存在腳本文件中是非常重要的)。然后,我教她怎么用Cmd-Enter組合鍵(譯者注:這是Mac OS的鍵位。在PC中,對應(yīng)的組合鍵是Ctrl+Enter)在控制臺(tái)中執(zhí)行代碼。
在解釋這些內(nèi)容的過程中,我意識到”控制臺(tái)”和”腳本”這類術(shù)語比較晦澀,所以我盡可能給出它們的明確的定義。我也不得不小心地使用那些含義確切的詞而非”REPL”或”prompt”這類詞匯
(3)注釋

(4)圖形
腳本、注釋和控制臺(tái)可能有點(diǎn)兒枯燥,所以到了這一步,該是從圖形中尋找點(diǎn)兒樂趣的時(shí)候了!這是我們繪制的一張圖:

教我妹妹理解這段代碼涉及解釋什么是函數(shù)(因?yàn)閞norm和hist都是函數(shù))、什么是函數(shù)的實(shí)參,以及為什么你可以通過名字引用實(shí)參卻不一定非得這樣做。
我還教她怎么保存一個(gè)圖形——借助圖形窗口中方便的“Export”按鈕,在RStudio中保存圖形非常容易。
(5)獲得幫助
我認(rèn)為,“獲取幫助”是這類快速入門過程中需要掌握的最重要的概念。顯然你不可能在一個(gè)小時(shí)之內(nèi)學(xué)會(huì)一切,所以,你真正需要的是當(dāng)你用到時(shí)可以查找到相應(yīng)信息的工具。下面是我介紹的語法:

考慮到查函數(shù)文檔對非程序員來說不太容易,這本來或許不是一個(gè)正確的策略。我考慮過強(qiáng)調(diào)google技巧的重要性(我在研究生院學(xué)到的最有用的東西),或者介紹StackOverFlow和R-help,但最后還是決定講解官方的文檔系統(tǒng)。”在R中我該怎么做X這件事”是初學(xué)者最常見的問題之一,我認(rèn)為這個(gè)問題的答案可能應(yīng)該是”使用函數(shù)Y( )”——所以重要的是能夠搞清楚如何使用函數(shù)Y( )。
在我看來,初學(xué)者最常見的另一個(gè)問題是”我遇到了出錯(cuò)信息Z,怎么修正它?”。為解決這個(gè)問題,我演示一些常見的錯(cuò)誤(對象未找到,意外的<X>常量,等等)并解釋了它們的含義。
(6)數(shù)據(jù)類型
查看幫助文檔讓我想起文檔中經(jīng)常會(huì)提及某個(gè)函數(shù)的實(shí)參必須是某個(gè)特定的類型,因此我們或許應(yīng)該討論一下數(shù)據(jù)類型。我介紹了:
向量

矩陣

數(shù)據(jù)框(dataframe)

就這樣,我們借助實(shí)例討論了一些數(shù)據(jù)類型,并順帶著學(xué)習(xí)了其他一些重要的內(nèi)容,像怎么確定向量、什么是工作目錄,以及怎樣讀入數(shù)據(jù)文件。
(7)探索性數(shù)據(jù)分析
一旦你讀入了一個(gè)數(shù)據(jù)集,事情就開始變得有趣了。我們從中學(xué)習(xí)了一大堆東西,像怎么做基本的表格、遇到缺失數(shù)據(jù)如何處理,以及怎么擬合一個(gè)簡單的線性模型。這部分的內(nèi)容相當(dāng)有趣,以至于我妹妹開始主導(dǎo)學(xué)習(xí)過程了:不再是我說“我要教你如何做什么”,而是她主動(dòng)問“嗯,我們能畫一個(gè)散點(diǎn)圖嗎?”或“你覺得我們可以把最優(yōu)擬合直線放到那個(gè)圖上嗎?”我真為此而感到高興——我希望這意味著她已全身心投入并樂在其中。

我們還進(jìn)一步學(xué)習(xí)了圖形,像怎么作出好的直方圖,以及怎么在回歸直線上疊加散點(diǎn)圖

 

1 hist(wages$wage, xlab = "hourly wage", main = "wages in our dataset", col = "purple")

 

2 plot(wages$age, wages$workyr, xlab = "age", ylab="years worked", main = "age vs. years worked")

 

3 abline(lm(wages$workyr ~ wages$age), col="red", lwd = 2)

 

好了,時(shí)間到。
我遺漏了些什么?哪些事能做得更好?我事后想到的有:
用[]取子集. 這是個(gè)關(guān)鍵知識點(diǎn)。它可以應(yīng)用于我所介紹的所有數(shù)據(jù)類型,而且極為有用。我真希望當(dāng)時(shí)有時(shí)間讓我妹妹做一個(gè),比如只包含女性的工資直方圖
編程相關(guān)的東西:循環(huán)、if語句、用戶自定義函數(shù),等等。不過我覺得不教這些東西也沒問題——考慮到受眾,我是把R當(dāng)作一個(gè)數(shù)據(jù)分析環(huán)境而非一種編程語言來教授。
保存.rda文件和/或工作區(qū)
安裝和載入包
其他數(shù)據(jù)類(比如列表)
其他(更好的?)幫助資源/提示/技巧
最后一點(diǎn)感想
總的來說,在一小時(shí)內(nèi)介紹R讓我收獲了樂趣,而且我認(rèn)為(希望?)我妹妹也是如此。臨別時(shí)我又給了她一些資料:這個(gè),這個(gè)和這個(gè),這些資料我都不是非常熟悉——但我知道,要想能夠用R分析實(shí)際數(shù)據(jù),所需的時(shí)間遠(yuǎn)大于在我這兒的一個(gè)小時(shí)。我相信我已經(jīng)覆蓋了大部分基礎(chǔ)知識,我妹妹也覺得這對她非常有幫助。我很樂意聽各位來談?wù)勀闶侨绾螒?yīng)對”一小時(shí)內(nèi)向非程序員介紹R”這個(gè)挑戰(zhàn)的。
腳注
注1. 即便對明尼蘇達(dá)來說,天氣也真的太冷了。溫度已在華氏0度(譯者注:攝氏-17度)左右徘徊了一個(gè)月之久。星期一的最高溫度是華氏-12度(譯者注:攝氏-24度)
注2.你可能注意到了,我用“=”來賦值,而且把這個(gè)習(xí)慣傳給了我妹妹。我考慮過這個(gè)問題并堅(jiān)持這一用法,“<-”要多敲鍵盤,我發(fā)現(xiàn)它唯一有用的地方只是當(dāng)我在system.time函數(shù)調(diào)用內(nèi)進(jìn)行賦值。
end

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }