有些內容使用中英雙語,有些只有英文或中文。歡迎使用與分享任何內容,但先來信告知並標示此部落格為出處。
Some parts use both Chinese and English, but some parts use only one language. Feel free to share, but please contact me first and list this blog as your reference.

2014年8月6日 星期三

Coursera 上課筆記 - Getting and Cleaning Data - 第一週 data.table (R programming)

這是 Coursera - Getting and Cleaning Data 上課筆記
第一週裡面我只有對 data.table 做筆記
對一些不同資料形式的讀取在R programming 裡面練習過了
所以就輕鬆看過去,不做筆記了~
筆記是我在上課時快速記錄,有點亂是正常...當作以後自己的reference


data.table 是一個package
用法跟data.frame很像,但是比較快(因為用C實作的)

宣告一樣
ex: DT <- data.tabe(x = rnorm(9), y = rep(c("a", "b", "c"), each = 3), z = rnorm(9))
ex: DF <- data.frame(x = rnorm(9), y = rep(c("a", "b", "c"), each = 3), z = rnorm(9))
=================================================

取出row:
row 的 subsetting的方式跟data.table一樣
ex: DT[DT$y==‘a’,]
=================================================

取出column:
column的subsetting方式不一樣
data.frame可以直接DF[,c(2, 3)]
data.table 可能可以這樣用:
ex: DT[, list(mean(x), sum(y))]
ex: DT[, list(y, z)] (跟DF[,c(2, 3)] 取出來的部分一樣)
=================================================

加上一個新的column:
ex: DT[, w:=z^2]
如果是data.frame要加上一個新的變數

R會把整份資料複製一次,在創造一個新的data.frame
對大型資料會有記憶體問題!
data.table就可以直接加上去不需要再複製一次

*注意:如果創造新的變數給data.table,應該只是複製原本的reference給新的變數,
所以兩個變數都指向同一個位置,會有一樣的內容,如果改了其中一個,
另一個也會看到相同的改變.(操作大資料時使用)

ex: 
DT2 <- DT
DT[, y:=2] (把DT的y column都改成2)

DT2 會跟一樣y column都變成2!!!

所以不能用 <- 來複製data.table

如果要複製要用copy function
ex: DT2 <- copy(DT) 這樣就會真的複製給新的變數(使用額外記憶體)


*補充:參考資料來源
如果在使用 <- 後對新變數裡面的element 使用assign (<- or =)
R就會複製新的物件!
ex:
DT = data.table(a=c(1,2), b=c(11,12))
newDT <- DT        
newDT$b[2] <- 200  # new operation
newDT[1, a := 100]

這樣newDT也會複製新的內容去別的記憶體!
此時DT, newDT所指的記憶體位置不同~
=================================================

在data.table裡面可以用多個operation
ex:
DT[, m := {tmp <- (x + z); log2(tmp + 5)}]
#在{}之中,會回傳最後的那個statement的結果,所以結果等於
# DT[, m := log2(x + y + 5)]
============================================

data.table裡面也可以直接做比較
ex: DT[, a := x>0]
多了一行boolean type的a

ex2:
DT[, b := mean(x + w)] #把x+y所有的直加起來找平均
DT[, b := mean(x + w), by = a]
#把a = TRUE的所有值加起來平均,在放到column b中 (a = TRUE的位置)
#把a = FALSE的所有值加起來平均,在放到column b中 (a = FALSE的位置)
============================================

.N 代表數目
ex:
DT4 <- data.table(x = sample(letters[1:3], 1E5, TRUE)) 
DT4[, .N, by = x] # 計算x 的group有多少個 ,就是計算a, b, c有幾個!
============================================

data.table裡面可以設定 key,可以依照key取出值!
ex:
DT5 <- data.table(x = rep(c("a", "b", "c"), each = 100), y = rnorm(300))
setkey(DT5, x) #以x當作DT5的key! 只能用 data.table
DT5[’b‘] #取出所有x 是b的值 ,用 DT5[“b"] 也是一樣


設定key後可以用merge把有相同key的data.table結合起來
ex:
> DT6 <- data.table(x =c('a', 'b', 'b', 'dt6'), y= 1:4)
> DT7 <- data.table(x =c('a', 'b', 'dt7'), z= 5:7)
> setkey(DT6, x); setkey(DT7, x)
> merge(DT6, DT7)
   x y z
1: a 1 5
2: b 2 6
3: b 3 6

merge也可以用在data.frame, 但是data.table再大資料快多了!
============================================

在從disc讀大資料的時候,data.table也快多了

ex:
big <- data.frame(x = rnorm(1E6), y = rnorm(1E6))#隨便創造一個較大資料
fiel <- tempfile()

#把這個資料寫進file裡面
write.table(big, file = file, row.names = FALSE, col.names = FALSE, sep = '\t', quote = FALSE)

#使用fread讀取,這是專門讀取data.table用的function
system.time(fread(file))
   user  system elapsed 
  0.333   0.029   0.372 

#跟一般的data.read比較起來快多了
system.time(read.table(file))
   user  system elapsed 
 10.644   0.080  10.861 


就先這樣囉~感覺是個不錯的方式!以後都儘量使用data.table,少用data.frame!


If you want to use (copy, paste or quote) my original article, please contact me through email. (autek.roy@gmail.com) If there is any mistake or comment, please let me know. :D

如要使用(複製貼上或轉載)作者原創文章, 請來信跟我聯絡。(autek.roy@gmail.com) 如果有發現任何的錯誤與建議請留言或跟我連絡。 : )

沒有留言:

張貼留言

請留下您的任何想法或建議!
Please leave any thought or comment!