這是 Coursera - Getting and Cleaning Data 上課筆記
第一週裡面我只有對 data.table 做筆記
對一些不同資料形式的讀取在R programming 裡面練習過了
所以就輕鬆看過去,不做筆記了~
筆記是我在上課時快速記錄,有點亂是正常...當作以後自己的reference
data.table 是一個package
就先這樣囉~感覺是個不錯的方式!以後都儘量使用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) 如果有發現任何的錯誤與建議請留言或跟我連絡。 : )
第一週裡面我只有對 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!