博客總目錄,記錄學習R與數據分析的一切:http://www.cnblogs.com/weibaar/p/4507801.html
-------
經過周末一個半天的努力,終於把這次的Assignment3做出來,然后做完Quiz4,順利結束R Programming這門課程。
對這門課的綜合吐槽就是,Roger老師的github頭像好帥,動態視頻更帥,視頻內容還算充足,但遠遠不足以應付assignment。Assignment設計一個比一個精巧,難度一個比一個大,沒有足夠的耐性以及一定的基礎,還真的很難獨自應付完R Programming這門課。如果不是我買了付費證書,以及工作中確實需要R,估計學着學着就廢掉了吧……
但是話說回來,這門課的assignment設計的還是頗為精巧的。
Swirl,
這個是個包,帶我們了解R的大部分內容。調用library(swirl), swirl()即可。R初學者請一定學習學習!設計極好!
Assignment1,
帶我們初步了解了循環,以及數據讀取和rbind。精華語句是以下兩段(代碼已修改,以避免泄題)。在這里,初步涉及了函數的編寫,循環的使用,以及數據框類型的先定義和rbind語句。同時在某個函數里通過threhold的引用,引入了if else結構。
https://github.com/derekfranks/practice_assignment/blob/master/practice_assignment.rmd
上面的github教程是我見過最好的指導教程,沒有它,assignment1就跪了。
files_list<-list.files(directory,full.names=TRUE) #read file list & cycle reading data
dat<-data.frame()
for (i in id){ id=i new1=sum(read.csv(files_list[i])) dat<-rbind(dat,new1) }
Assignment2,
這個的精華在於對詞法作用域的介紹,並介紹了函數緩存值,虛擬函數,函數內變量,以及<<-的使用。不過從代碼的角度來說,示例的實際應用意義不大。倒不如quiz里涉及的東西全面。但好好消化以后,會發現對詞法作用域有了較深的理解,在之后用sapply, lapply, tapply等函數時,也比較敢於編程了。
set <- function(y){ x<<-y m<<-NULL setSolve <- function(solve) m<<-solve
Assignment3,這道題由3個部分組成,除了第二部分外,剩下兩部分都要耗時4-5個小時思考……不愧是壓軸的assignment,做到讓人近似崩潰。但是這個也是對R知識應用最綜合的題目。前面兩部分要用到的函數,以及方法,在本次assignment3里都被拎出來
整理一下:
1)數據框,我們經常會用split按照某個變量拆分數據框,這樣會出來一系列由data.frame組合的list。
如果用data[i],只會拿到一堆list,只有用data[[i]]才能拿到原本的data.frame格式。這是為什么以下代碼可以生效的原因。
data_split<-split(data_complete,data_complete$State)
new1<-cbind(data_order[[i]],rank)
2)數據框篩選,我們要么用==直接獲得等於某個數值的數據庫,要么我們可以利用!any或者all函數來判斷,某個值是否在數據框里,如果不在,彈出錯誤信息。但是注意,這里由於循環補齊的原因,num,outcome以單個字符/數字為佳。向量要用其他方法。
final<-r[r$rank==num,] if (!any(colname==outcome)){ stop("invalid outcome")
3)關於numeric函數,如果一個數據里有一堆ta,1,2,3,4, not avilalbe,使用as.numeric可以快速的把非數值函數轉化為NA。這樣才可以加入計算。(對於取整,用as.integer效率奇佳)
var<-as.numeric(list[colname==outcome,1])
4)利用colnames(x)<-c(ddd,ddd)可以給數據庫快速命名
colnames(final)<-c("hospital","state")
5)關於排序,先獲得split的函數后,使用lapply可以快速對數據進行排序。然后用rbind,[[i]]又可以快速結合回來
data_order<-lapply(data_split,function(x) x[order(x[,3],x[,1]),])
6)關於1:length。之前在這里考死了很多回。后來發現,如果nrow()-1<-0,NA的話,用2:nrow-1會返回一個2,1,0向量。這樣,在循環補齊時就會報錯。而且是報很多錯。然后if else, else一定要接在}后面,另起一行的話,R也很容易報錯<--論良好的函數書寫習慣的重要性。
if (nrow(xx[[i]])==1) { rank=c("a") } else { if (nrow(data_order[[i]])==2){ rank=c("a","d") }else { rank=c("a",2:(nrow(data_order[[i]])-1),"d")}}
綜上,這是我在做assignment3里被踩過的若干個坑……
感謝我終於出來了
謝謝JHU貢獻的這么有操作意義的R Programming的課程,接下來打算繼續跟着學習cleanning data,聽說assignment也很難ε(罒ω罒)з。。。。給跪
最后補充一下
當全身心投入一門課的學習時,會覺得時間過得很快,也很充實。之后不會再迷茫了。數據分析,其實就是多學,多練,多思考,多做碼農。慶幸我開始的還不算太晚。
以及,因為這個月太沉迷於R,被同事吐槽說,一整天撲在編程還有R上,怪不得你沒有男朋友……單身狗內牛滿面……
博客總目錄,記錄學習R與數據分析的一切:http://www.cnblogs.com/weibaar/p/4507801.html