Re: [問題] data frame排序問題

作者: celestialgod (天)   2016-11-01 20:49:35
※ 引述《locka (locka)》之銘言:
: [問題類型]:
:
: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
:
: [問題敘述]:
: 請簡略描述你所要做的事情,或是這個程式的目的
: 各位大大們好:
: 想請教該怎麼把一個 data frame 裡面的row 按特定順序重新排序
: 例如說我有一個 list factory_list 是a,b,c,d,e
: 然後我dataframe mydf是
: c 1000
: d 1500
: b 3000
: 我想要按照factory_list的順序重新排序變成
: a 0
: b 3000
: c 1000
: d 1500
: e 0
: 當list跟mydf長度一樣的時候我用 mydf[factory_list,] 可以正確排序
: 但當list長度不一樣的時候就會出現問題
: 想了很久實在不知道該從何下手,煩請各位大大求解惑了 m(__)m
: *補充:
: 原本想自己重現問題可是卻無法(結果不對)
: 所以後來是用dput把原始data印出來再修改
: 詳細情形請見程式碼
: (不知道差別在哪裡...如果有大大知道為什麼也歡迎指點!)
: 先謝謝大家了!!!
: [程式範例]:
:
: http://ideone.com/YmgnI7
:
: [關鍵字]:
:
: data frame, 排序
用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))
print(dt1_sorted)
# factory rev
# 1: 台北 9.23913
# 2: 台中 15.09804
# 3: 高雄 16.35714
# 4: 新竹 15.62069
# 5: 台南 10.00000
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))
print(dt2_sorted)
# factory rev
# 1: 台北 9.23913
# 2: 台中 16.35714
# 3: 高雄 15.62069
# 4: 新竹 0.00000
# 5: 台南 0.00000
作者: locka (locka)   2016-11-01 20:57:00
感謝celestialgod大大,回到家來研究看看不過如果我原始的factory_list不是data.table的話怎麼辦呢我原始的factory_list其實是用readOGR下載的地圖中的某欄位之後要拿來作圖 不確定把factory_list改成dt後能不能用我回家再試試看!!
作者: cywhale (cywhale)   2016-11-01 22:07:00
如果DT中有factory欄位 setkey(DT,factory) 然後你有原來的factorlist, DT[factorlist, nomatch=NA]再把NA改0即可如果只有dataframe, out<-df[match(lf,rownames(df)),]再把out[is.na(out)]<-0和rownames加回去應也不會太麻煩?

Links booklink

Contact Us: admin [ a t ] ucptt.com