※ 引述《locka (locka)》之銘言:
: 先謝謝celestailgod大大的幫忙,不過抱歉小弟資質駑鈍
: 希望可以跟板上各位前輩求教討論>"<
: ※ 引述《celestialgod (天)》之銘言:
: : 用merge跟match就可以達到你要的效果了
: : library(data.table)
: : library(pipeR)
: : factory_list_dt <- data.table(factory = c("台北", "台中", "高雄",
: : "新竹", "台南"))
: : dt1 <- data.table(factory = c("台北", "高雄", "新竹", "台中", "台南"),
: : rev = c(9.23913043478261,16.3571428571429,
: : 15.6206896551724, 15.0980392156863, 10))
: : dt1_sorted <- merge(factory_list_dt, dt1, by = "factory", all.x = TRUE) %>>%
: : `[`(match(factory_list_dt$factory, factory))
: 我知道前面 merge 會藉由對應factory這個欄位 把 f_list, dt1 join 在一起
: (如果沒理解錯的話)
: 這邊主要想請問的都是`[`(match(factory_list_dt$factory, factory)) 這一行
: 1. match函式的第二個參數 "factory" 是甚麼東西的factory呢?
: 個人猜測是前面 merge() 完產生出來的新的data table(在此設為dt_new)
: 所以意思應該是「列出 f_list_dt中factory,在dt_new中的位置」
: 不知道這樣的理解正不正確?
factory是merge出來的data.table中的一個column,也就是你這說的dt_new
: 2. 那為什麼要用()把match的結果包起來?
: 3. `[` 的意思是...?
2跟3一起說明,其實我們再用 A[i,j] 可以寫作 `[`(A, i, j),`[`是一個函數
: : dt2 <- data.table(factory = c("台北", "台中", "高雄"),
: : rev = c(9.23913043478261,16.3571428571429, 15.6206896551724))
: : dt2_sorted <- merge(factory_list_dt, dt2, by = "factory", all.x = TRUE) %>>%
: : `[`(match(factory_list_dt$factory, factory)) %>>%
: : `[`(j = rev := ifelse(is.na(rev), 0, rev))
: 這邊 `[`(j = rev := ifelse(is.na(rev), 0, rev)) 也有同樣的問題
: 我知道大概意思是判斷rev, 如果其值是na的話就補0 否則就填rev原本的值
: 可是這個j是怎麼冒出來的啊???
同2 3,j是`[`第三個element
: 最後真的不得不感謝celestialgod大大,每次都可以瞬間解決問題
: 而且程式碼都好簡潔啊!
: 也謝謝大家熱情幫忙!! :)